জটিলতার তথ্য প্রকাশ করুন

জটিলতা তথ্য উৎসগুলি ঘড়ির মুখের জটিলতার তথ্য প্রকাশ করে, যা ঘড়ির মুখ রেন্ডার করতে পারে এমন পাঠ্য, চিত্র এবং সংখ্যা সরবরাহ করে।

একটি ডেটা সোর্স পরিষেবা সরাসরি একটি ওয়াচফেসে দরকারী তথ্য সরবরাহ করার জন্য SuspendingComplicationDataSourceService প্রসারিত করে।

শুরু করা

আপনার অ্যাপ মডিউলে নিম্নলিখিত নির্ভরতা যোগ করুন:

dependencies {
  implementiation("androidx.wear.watchface:watchface-complications-data-source-ktx:1.2.1")
}

ডেটা সোর্স পরিষেবা তৈরি করুন

যখন জটিলতা সংক্রান্ত ডেটার প্রয়োজন হয়, তখন Wear OS সিস্টেম আপনার ডেটা সোর্সে আপডেটের অনুরোধ পাঠায়। আপডেটের অনুরোধের প্রতিক্রিয়া জানাতে, আপনার ডেটা সোর্সকে SuspendingComplicationDataSourceService ক্লাসের onComplicationRequest() পদ্ধতিটি প্রয়োগ করতে হবে।

Wear OS সিস্টেমটি যখন আপনার উৎস থেকে ডেটার প্রয়োজন হয় তখন onComplicationRequest() কল করে—উদাহরণস্বরূপ, যখন আপনার ডেটা উৎস ব্যবহার করে কোনও জটিলতা সক্রিয় হয় অথবা যখন একটি নির্দিষ্ট সময় অতিবাহিত হয়।

দ্রষ্টব্য: যখন আপনার ডেটা সোর্স ডেটা সরবরাহ করে, তখন ওয়াচফেসটি কাঁচা মানগুলি গ্রহণ করে। প্রদর্শনের জন্য ডেটা ফর্ম্যাট করার জন্য ওয়াচফেস দায়ী।

নিম্নলিখিত কোড স্নিপেটটি একটি নমুনা বাস্তবায়ন দেখায়:

class MyComplicationDataSourceService : SuspendingComplicationDataSourceService() {
    override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
        // Retrieve the latest info for inclusion in the data.
        val text = getLatestData()
        return shortTextComplicationData(text)
    }

    override fun getPreviewData(type: ComplicationType): ComplicationData? {
        return shortTextComplicationData("Event 1")
    }

    private fun shortTextComplicationData(text: String) =
        ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text).build(),
            contentDescription = PlainComplicationText.Builder(text).build()
        )
            // Add further optional details here such as icon, tap action, and title.
            .build()

    // ...
}

ম্যানিফেস্ট ঘোষণা এবং অনুমতি

ডেটা সোর্সগুলিকে অবশ্যই তাদের অ্যাপ ম্যানিফেস্টে নির্দিষ্ট ঘোষণা অন্তর্ভুক্ত করতে হবে যাতে অ্যান্ড্রয়েড সিস্টেম তাদের ডেটা সোর্স হিসেবে গণ্য করতে পারে। এই বিভাগটি ডেটা সোর্সের জন্য প্রয়োজনীয় সেটিংস ব্যাখ্যা করে।

আপনার অ্যাপের ম্যানিফেস্টে, পরিষেবাটি ঘোষণা করুন এবং একটি আপডেট অনুরোধ অ্যাকশন ইনটেন্ট ফিল্টার যোগ করুন। ম্যানিফেস্টটিকে BIND_COMPLICATION_PROVIDER অনুমতি যোগ করে পরিষেবাটি সুরক্ষিত করতে হবে যাতে শুধুমাত্র Wear OS সিস্টেমই প্রদানকারী পরিষেবার সাথে সংযুক্ত হতে পারে।

এছাড়াও, service উপাদানে একটি android:icon অ্যাট্রিবিউট অন্তর্ভুক্ত করুন যা একটি একক রঙের সাদা আইকন প্রদান করে। আমরা আইকনগুলির জন্য ভেক্টর ড্রয়েবলগুলি সুপারিশ করি। আইকনটি ডেটা উৎসকে প্রতিনিধিত্ব করে এবং জটিলতা চয়নকারীতে দেখানো হয়।

এখানে একটি উদাহরণ:

<service
    android:name=".snippets.complication.MyComplicationDataSourceService"
    android:exported="true"
    android:label="@string/my_complication_service_label"
    android:icon="@drawable/complication_icon"
    android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER">
    <intent-filter>
        <action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST" />
    </intent-filter>

    <!-- Supported types should be comma-separated, for example: "SHORT_TEXT,SMALL_IMAGE" -->
    <meta-data
        android:name="android.support.wearable.complications.SUPPORTED_TYPES"
        android:value="SHORT_TEXT" />
    <meta-data
        android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
        android:value="300" />

    <!-- Optionally, specify a configuration activity, where the user can configure your complication. -->
    <meta-data
        android:name="android.support.wearable.complications.PROVIDER_CONFIG_ACTION"
        android:value="MY_CONFIG_ACTION" />

</service>

মেটাডেটা উপাদান

আপনার ম্যানিফেস্ট ফাইলে, নিম্নলিখিত মেটাডেটা উপাদানগুলি লক্ষ্য করুন:

  • android:name="android.support.wearable.complications.SUPPORTED_TYPES" : ডেটা সোর্স যে ধরণের জটিলতা ডেটা সমর্থন করে তা নির্দিষ্ট করে।
  • android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS" : সিস্টেম কতবার ডেটা আপডেটের জন্য পরীক্ষা করবে তা নির্দিষ্ট করে।

যখন আপনার জটিলতা ডেটা ডেটা সোর্স সক্রিয় থাকে, তখন UPDATE_PERIOD_SECONDS নির্দিষ্ট করে যে আপনি কত ঘন ঘন সিস্টেমটি ডেটার আপডেট পরীক্ষা করতে চান। যদি জটিলতায় দেখানো তথ্য নিয়মিত সময়সূচীতে আপডেট করার প্রয়োজন না হয়, যেমন যখন আপনি পুশ আপডেট ব্যবহার করছেন , তাহলে এই মানটি 0 এ সেট করুন।

যদি আপনি UPDATE_PERIOD_SECONDS কে 0 তে সেট না করেন, তাহলে ডিভাইসের ব্যাটারি লাইফ সংরক্ষণের জন্য আপনাকে কমপক্ষে 300 (5 মিনিট) মান ব্যবহার করতে হবে, যা সিস্টেম দ্বারা প্রয়োগ করা সর্বনিম্ন আপডেট পিরিয়ড। এছাড়াও, মনে রাখবেন যে ডিভাইসটি অ্যাম্বিয়েন্ট মোডে থাকলে বা জীর্ণ না হলে আপডেটের অনুরোধ কম আসে।

একটি কনফিগারেশন কার্যকলাপ যোগ করুন

প্রয়োজনে, একটি ডেটা সোর্সে একটি কনফিগারেশন অ্যাক্টিভিটি অন্তর্ভুক্ত থাকতে পারে যা ব্যবহারকারী যখন জটিলতা বাছাইকারী থেকে সেই বিশেষ ডেটা সোর্সটি বেছে নেয় তখন তাকে দেখানো হয়। উদাহরণস্বরূপ, একটি ওয়ার্ল্ড ক্লক ডেটা সোর্সে একটি কনফিগারেশন অ্যাক্টিভিটি থাকতে পারে যা ব্যবহারকারীকে প্রদর্শনের জন্য শহর বা সময় অঞ্চল বেছে নিতে দেয়।

উদাহরণ ম্যানিফেস্টে PROVIDER_CONFIG_ACTION কী সহ একটি meta-data উপাদান রয়েছে। এই উপাদানটির মান হল কনফিগারেশন কার্যকলাপ চালু করতে ব্যবহৃত ক্রিয়া।

কনফিগারেশন অ্যাক্টিভিটি তৈরি করুন এবং আপনার ম্যানিফেস্ট ফাইলে এর অ্যাকশনের সাথে মেলে এমন একটি ইনটেন্ট ফিল্টার যোগ করুন।

<intent-filter>
    <action android:name="MY_CONFIG_ACTION" />
    <category android:name="android.support.wearable.complications.category.PROVIDER_CONFIG" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

অ্যাক্টিভিটিটি যে জটিলতা স্লটটি কনফিগার করছে তার বিশদ বিবরণ অ্যাক্টিভিটির onCreate() পদ্ধতির মধ্যে থাকা ইন্টেন্ট থেকে পেতে পারে:

// Keys defined on ComplicationDataSourceService
val id = intent.getIntExtra(EXTRA_CONFIG_COMPLICATION_ID, -1)
val type = intent.getIntExtra(EXTRA_CONFIG_COMPLICATION_TYPE, -1)
val source = intent.getStringExtra(EXTRA_CONFIG_DATA_SOURCE_COMPONENT)

কনফিগারেশন অ্যাক্টিভিটি অবশ্যই প্রোভাইডার প্যাকেজের মধ্যেই থাকা উচিত। ডেটা সোর্স সেট করা উচিত কিনা তা সিস্টেমকে জানাতে কনফিগারেশন অ্যাক্টিভিটি অবশ্যই RESULT_OK অথবা RESULT_CANCELED রিটার্ন করবে:

setResult(RESULT_OK) // Or RESULT_CANCELED to cancel configuration
finish()

পুশ আপডেট ব্যবহার করুন

আপনার অ্যাপের ম্যানিফেস্টে একটি আপডেট ব্যবধান নির্দিষ্ট করার বিকল্প হিসেবে, আপনি গতিশীলভাবে আপডেট শুরু করতে ComplicationDataSourceUpdateRequester এর একটি উদাহরণ ব্যবহার করতে পারেন। একটি আপডেটের অনুরোধ করতে, requestUpdate() কল করুন।

সতর্কতা: ডিভাইসের ব্যাটারি লাইফ সংরক্ষণের জন্য, আপনার ComplicationDataSourceUpdateRequester এর ইনস্ট্যান্স থেকে গড়ে প্রতি ৫ মিনিটের বেশি requestUpdate() কল করবেন না।

সময়-নির্ভর মান প্রদান করুন

কিছু জটিলতার জন্য বর্তমান সময়ের সাথে সম্পর্কিত একটি মান প্রদর্শন করা প্রয়োজন। উদাহরণের মধ্যে রয়েছে বর্তমান তারিখ, পরবর্তী মিটিং পর্যন্ত সময়, অথবা অন্য সময় অঞ্চলের সময়।

প্রতি সেকেন্ডে বা মিনিটে কোনও জটিলতা আপডেট করবেন না যাতে সেই মানগুলি আপডেট থাকে। পরিবর্তে, সময়-নির্ভর টেক্সট ব্যবহার করে বর্তমান তারিখ বা সময়ের সাথে সম্পর্কিত মানগুলি নির্দিষ্ট করুন। নিম্নলিখিত ক্লাসগুলি আপনাকে এই সময়-নির্ভর মানগুলি তৈরি করতে দেয়:

  • TimeFormatComplicationText - একটি তারিখ বা সময়ের মান ফর্ম্যাট করে।
  • TimeDifferenceComplicationText - একটি নির্দিষ্ট সময় পর্যন্ত উপরে বা নীচে গণনা করা হয়।

টাইমলাইন ডেটা

জটিল ডেটা সোর্সগুলির জন্য যা পূর্ব-নির্ধারিত সময়ে মানের ক্রম প্রদান করে, SuspendingTimelineComplicationDataSourceService ব্যবহার করুন।

এর একটি উদাহরণ হল একটি ক্যালেন্ডার অ্যাপ থেকে "পরবর্তী ইভেন্ট" ডেটা সোর্স: পরবর্তী ইভেন্টের জন্য সিস্টেমকে নিয়মিত ডেটা সোর্স পোল করার পরিবর্তে, ডেটা সোর্স একবার ইভেন্টের একটি টাইমলাইন প্রদান করতে পারে এবং তারপর ক্যালেন্ডার পরিবর্তন হলে ডেটা সোর্স আপডেট শুরু করতে পারে। এটি সিস্টেমের উপর লোড কমিয়ে দেয় এবং জটিলতাকে সময়মত সঠিক ইভেন্টটি দেখাতে দেয়:

class MyTimelineComplicationDataSourceService : SuspendingTimelineComplicationDataSourceService() {
    override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationDataTimeline? {
        if (request.complicationType != ComplicationType.SHORT_TEXT) {
            return ComplicationDataTimeline(
                defaultComplicationData = NoDataComplicationData(),
                timelineEntries = emptyList()
            )
        }
        // Retrieve list of events from your own datasource / database.
        val events = getCalendarEvents()
        return ComplicationDataTimeline(
            defaultComplicationData = shortTextComplicationData("No event"),
            timelineEntries = events.map {
                TimelineEntry(
                    validity = TimeInterval(it.start, it.end),
                    complicationData = shortTextComplicationData(it.name)
                )
            }
        )
    }

    override fun getPreviewData(type: ComplicationType): ComplicationData? {
        return shortTextComplicationData("Event 1")
    }

    private fun shortTextComplicationData(text: String) =
        ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text).build(),
            contentDescription = PlainComplicationText.Builder(text).build()
        )
            // Add further optional details here such as icon, tap action, title etc
            .build()

    // ...
}

SuspendingTimelineComplicationDataSourceService এর আচরণ নিম্নরূপ:

  • যখন বর্তমান সময় টাইমলাইনে একটি এন্ট্রির শুরু এবং শেষ সময়ের মধ্যে পড়ে, তখন ঘড়ির মুখটি সেই মানটি ব্যবহার করে।
  • যখন বর্তমান সময় টাইমলাইনের কোনও এন্ট্রির মধ্যে পড়ে না, তখন ডিফল্ট মান ব্যবহার করা হয়। উদাহরণস্বরূপ, ক্যালেন্ডার অ্যাপে, এটি "কোনও ইভেন্ট নেই" হতে পারে।
  • যদি বর্তমান সময় একাধিক ইভেন্টের মধ্যে পড়ে, তাহলে সবচেয়ে ছোট ইভেন্টটি ব্যবহার করা হয়।

গতিশীল মান প্রদান করুন

Wear OS 4 থেকে শুরু করে, কিছু জটিলতা এমন মান প্রদর্শন করতে পারে যা প্ল্যাটফর্মে সরাসরি উপলব্ধ মানের উপর ভিত্তি করে আরও ঘন ঘন রিফ্রেশ হয়। আপনার জটিলতায় এই ক্ষমতা প্রদান করতে, ComplicationData ক্ষেত্রগুলি ব্যবহার করুন যা গতিশীল মান গ্রহণ করে। প্ল্যাটফর্মটি জটিলতা প্রদানকারীকে চালানোর প্রয়োজন ছাড়াই ঘন ঘন এই মানগুলি মূল্যায়ন এবং আপডেট করে।

উদাহরণ ক্ষেত্রগুলির মধ্যে রয়েছে GoalProgressComplicationData এর গতিশীল মান ক্ষেত্র এবং DynamicComplicationText , যা যেকোনো ComplicationText ক্ষেত্রে ব্যবহার করা যেতে পারে। এই গতিশীল মানগুলি androidx.wear.protolayout.expression লাইব্রেরির উপর ভিত্তি করে তৈরি।

কিছু পরিস্থিতিতে, প্ল্যাটফর্মটি গতিশীল মান মূল্যায়ন করতে পারে না:

  • কখনও কখনও ডায়নামিক মান পাওয়া যায় না: উদাহরণস্বরূপ, যখন ডিভাইসটি কব্জির বাইরে থাকে তখন এটি ঘটে। এই পরিস্থিতিতে, প্ল্যাটফর্মটি NoDataComplicationData এর প্লেসহোল্ডার ক্ষেত্রের পরিবর্তে ডায়নামিক মান অবৈধকরণ ফলব্যাক ক্ষেত্রের মান ব্যবহার করে।
  • ডায়নামিক মান কখনই পাওয়া যায় না: এটি এমন একটি ডিভাইসে ঘটে যা Wear OS 4 এর একটি পুরানো সংস্করণে চলছে। এই পরিস্থিতিতে, প্ল্যাটফর্মটি একটি সহযোগী ফলব্যাক ক্ষেত্র ব্যবহার করে, যেমন getFallbackValue ()