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

কমপ্লিকেশন ডেটা সোর্সগুলো ওয়াচ ফেস কমপ্লিকেশনগুলোতে তথ্য সরবরাহ করে, যা ওয়াচ ফেসটি প্রদর্শন করতে পারে এমন টেক্সট, ছবি এবং সংখ্যা প্রদান করে।

একটি ডেটা সোর্স সার্ভিস, 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 () এর মতো একটি সহযোগী ফলব্যাক ফিল্ড ব্যবহার করে।