LVL क्लास और इंटरफ़ेस
पहली टेबल में, लाइसेंस की पुष्टि से जुड़ी सभी सोर्स फ़ाइलों की सूची दी गई है
Android SDK के ज़रिए उपलब्ध लाइब्रेरी (LVL). सभी फ़ाइलें इसका हिस्सा हैं
com.android.vending.licensing
पैकेज.
कैटगरी | नाम | ब्यौरा |
---|---|---|
लाइसेंस की जांच और नतीजा | लाइसेंस-चेकर | वह क्लास जिसे आपने लाइसेंस की जांच शुरू करने के लिए इंस्टैंशिएट (या सब-क्लास) किया है. |
लाइसेंस-चेकरकॉलबैक | ऐसा इंटरफ़ेस जिसे आपने लाइसेंस की जांच के नतीजे को मैनेज करने के लिए लागू किया है. | |
नीति | नीति | ऐसा इंटरफ़ेस जिसे लागू करके यह तय किया जाता है कि अनुमति देनी है या नहीं लाइसेंस के रिस्पॉन्स के आधार पर, ऐप्लिकेशन का ऐक्सेस. |
सर्वर प्रबंधित नीति | डिफ़ॉल्ट Policy लागू करने की प्रक्रिया. यह पार्टनर,
लाइसेंस डेटा के स्थानीय स्टोरेज, लाइसेंस की वैधता, और लाइसेंस की वैधता को मैनेज करने के लिए, लाइसेंस देने वाला सर्वर
फिर से कोशिश करें. |
|
सख्त नीति | वैकल्पिक Policy लागू करना. डायरेक्ट मार्केटिंग के आधार पर लाइसेंस लागू करता है
का इस्तेमाल करें. कैश मेमोरी में सेव नहीं किया जा रहा है या दोबारा कोशिश करने का अनुरोध नहीं किया जा सकता. |
|
डेटा अस्पष्ट बनाना (वैकल्पिक) |
ओबफ़स्केटर | ऐसा इंटरफ़ेस जिसे आप तब लागू करते हैं, जब आप Policy (जैसे
ServerManagedPolicy) तय किया गया है, जो स्थायी स्टोर में लाइसेंस रिस्पॉन्स डेटा को कैश मेमोरी में सेव करता है.
लिखे जा रहे डेटा को एन्कोड और डिकोड करने के लिए, अस्पष्ट बनाने वाला एल्गोरिदम लागू करता है या
पढ़ें. |
एईएसओबीफ़ुस्केटर | डिफ़ॉल्ट रूप से, AES एन्क्रिप्शन/डिक्रिप्टिंग का इस्तेमाल करके, इसे लागू किया जाता है एल्गोरिदम की मदद ली जाती है. | |
डिवाइस की सीमा (ज़रूरी नहीं) |
Devicelimiter | ऐसा इंटरफ़ेस जिसे आप लागू कर सकते हैं, अगर आप किसी खास डिवाइस पर ऐप्लिकेशन डाउनलोड करें. लाइसेंस-वैलिडेटर से कॉल किया गया. लागू करना ज़्यादातर ऐप्लिकेशन के लिए Devicelimiter का इस्तेमाल करने का सुझाव नहीं दिया जाता, क्योंकि इसके लिए ज़रूरी है कि बैकएंड सर्वर की वजह से, उपयोगकर्ता लाइसेंस वाले ऐप्लिकेशन का ऐक्सेस खो सकता है, जब तक कि इसे सोच-समझकर डिज़ाइन न किया गया हो. |
NullDevicelimiter | डिफ़ॉल्ट DeviceLimiter लागू है, जो नो-ऑप है. इससे सभी डिवाइसों के हिसाब से). | |
लाइब्रेरी का मुख्य कॉन्टेंट, इंटिग्रेशन की ज़रूरत नहीं है | रिस्पॉन्स डेटा | वह क्लास जिसमें लाइसेंस रिस्पॉन्स वाले फ़ील्ड शामिल होते हैं. |
लाइसेंस वैलिडेटर | ऐसी क्लास जो लाइसेंस देने के अनुरोध से मिले जवाब को डिक्रिप्ट करती है और उसकी पुष्टि करती है सर्वर. | |
पुष्टि से जुड़ा अपवाद | डेटा के रखरखाव की पुष्टि करते समय होने वाली गड़बड़ियों के बारे में बताने वाली क्लास इसे ऑब्फ़स्केटर मैनेज करता है. | |
PreferenceObfuscator | यूटिलिटी क्लास, जो सिस्टम के अस्पष्ट डेटा को लिख/पढ़ती है
SharedPreferences स्टोर. |
|
लाइसेंसिंग सेवा | एकतरफ़ा आईपीसी इंटरफ़ेस, जिस पर लाइसेंस की जांच का अनुरोध पास किया जाता है Google Play क्लाइंट चुनें. | |
IलाइसेंसresultsListener | एकतरफ़ा आईपीसी कॉलबैक लागू करना, जिस पर ऐप्लिकेशन को लाइसेंसिंग सर्वर से एसिंक्रोनस रिस्पॉन्स. |
सर्वर से जवाब
दूसरी टेबल में, लाइसेंस के रिस्पॉन्स फ़ील्ड के तौर पर लौटाए गए सभी लाइसेंस देने वाला सर्वर.
फ़ील्ड | ब्यौरा |
---|---|
responseCode |
लाइसेंस देने वाले सर्वर से मिला रिस्पॉन्स कोड. रिस्पॉन्स कोड इसकी जानकारी सर्वर रिस्पॉन्स कोड में दी गई है. |
signedData |
लाइसेंस देने वाले सर्वर से मिले डेटा को होल्ड करने वाला स्ट्रिंग जोड़ने का तरीका, जैसा कि यहां बताया गया है:
responseCode|nonce|packageName|versionCode|userId|timestamp:extras .
|
signature |
ऐप्लिकेशन के लिए खास कुंजी का इस्तेमाल करके, signedData का हस्ताक्षर.
|
सर्वर रिस्पॉन्स कोड
टेबल 3 में, उन सभी लाइसेंस रिस्पॉन्स कोड की सूची दी गई है जिनका इस्तेमाल लाइसेंस देने वाला सर्वर. आम तौर पर, ऐप्लिकेशन को इन सभी रिस्पॉन्स को हैंडल करना चाहिए कोड. डिफ़ॉल्ट रूप से, LVL की LicenseValidator क्लास डिफ़ॉल्ट रूप से वे सभी सुविधाएं देती है इन रिस्पॉन्स कोड को मैनेज करना ज़रूरी है.
रिस्पॉन्स कोड | पूर्णांक-मान बताना | ब्यौरा | क्या आपने इलेक्ट्रॉनिक हस्ताक्षर कर दिया है? | बोनस वीडियो | टिप्पणियां |
---|---|---|---|---|---|
LICENSED |
0 |
उपयोगकर्ता के पास ऐप्लिकेशन का लाइसेंस हो. उपयोगकर्ता ने ऐप्लिकेशन है या अल्फ़ा या बीटा वर्शन को डाउनलोड और इंस्टॉल करने के लिए अधिकृत है आवेदन की प्रक्रिया के बारे में ज़्यादा जानें. | हां | VT , GT , और GR |
Policy की शर्तों के हिसाब से ऐक्सेस करने की अनुमति दें. |
LICENSED_OLD_KEY |
2 |
ऐप्लिकेशन के पास उपयोगकर्ता के लिए लाइसेंस है, लेकिन एक अपडेट किया गया ऐप्लिकेशन भी है ऐसा वर्शन उपलब्ध है जिसे किसी दूसरी कुंजी से साइन किया गया है. | हां | VT , GT , GR , UT |
Policy कंस्ट्रेंट के हिसाब से ऐक्सेस दिया जा सकता है.
इससे पता चलता है कि कुंजी का वह जोड़ा जिसे इंस्टॉल किया गया है ऐप्लिकेशन का वर्शन अमान्य है या उसके साथ छेड़छाड़ की गई है. ऐप्लिकेशन ऐक्सेस करने की अनुमति दे सकता है अगर ज़रूरत हो या उपयोगकर्ता को यह बताएं कि अपग्रेड उपलब्ध है और उसका इस्तेमाल सीमित किया जा सकता है जब तक अपग्रेड नहीं हो जाता. |
NOT_LICENSED |
1 |
उपयोगकर्ता के पास ऐप्लिकेशन का लाइसेंस नहीं है. | नहीं | ऐक्सेस न दें. | |
ERROR_CONTACTING_SERVER |
257 |
स्थानीय गड़बड़ी — Google Play ऐप्लिकेशन शायद नेटवर्क की उपलब्धता से जुड़ी समस्याओं की वजह से, लाइसेंस देने वाला सर्वर. | नहीं | Policy की फिर से कोशिश करने की सीमाओं के हिसाब से, लाइसेंस की जांच करने की फिर से कोशिश करें. |
|
ERROR_SERVER_FAILURE |
4 |
सर्वर गड़बड़ी — सर्वर ऐप्लिकेशन की कुंजी लोड नहीं कर सका जोड़ें. | नहीं | Policy की फिर से कोशिश करने की सीमाओं के हिसाब से, लाइसेंस की जांच करने की फिर से कोशिश करें.
|
|
ERROR_INVALID_PACKAGE_NAME |
258 |
स्थानीय गड़बड़ी — ऐप्लिकेशन ने पैकेज के लिए लाइसेंस की जांच करने का अनुरोध किया है जो डिवाइस पर इंस्टॉल नहीं है. | नहीं | लाइसेंस की जांच करने की फिर से कोशिश न करें.
आम तौर पर, डेवलपमेंट की किसी गड़बड़ी की वजह से ऐसा होता है. |
|
ERROR_NON_MATCHING_UID |
259 |
स्थानीय गड़बड़ी — ऐप्लिकेशन ने पैकेज के लिए लाइसेंस की जांच करने का अनुरोध किया है जिसका यूआईडी (पैकेज, यूज़र आईडी पेयर) अनुरोध किए गए का इस्तेमाल करें. | नहीं | लाइसेंस की जांच करने की फिर से कोशिश न करें.
आम तौर पर, डेवलपमेंट की किसी गड़बड़ी की वजह से ऐसा होता है. |
|
ERROR_NOT_MARKET_MANAGED |
3 |
सर्वर गड़बड़ी — ऐप्लिकेशन (पैकेज का नाम) की पहचान नहीं हुई Google Play से डाउनलोड करें. | नहीं | लाइसेंस की जांच करने की फिर से कोशिश न करें.
यह बताया जा सकता है कि ऐप्लिकेशन पब्लिश नहीं किया गया था या लाइसेंस देने में कोई डेवलपमेंट गड़बड़ी हुई है लागू करना. |
ध्यान दें: जैसा कि में बताया गया है टेस्टिंग एनवायरमेंट सेट अप करना, रिस्पॉन्स कोड को मैन्युअल तरीके से सेट अप किया जा सकता है ऐप्लिकेशन डेवलपर और Google Play Console पर जाएं.
ध्यान दें: पहले, ऐप्लिकेशन की जांच के लिए अप्रकाशित "ड्राफ़्ट" अपलोड करना वर्शन है. यह सुविधा अब काम नहीं करती समर्थित; इसके बजाय, आपको इसे ऐल्फ़ा या बीटा डिस्ट्रिब्यूशन पर पब्लिश करना होगा चैनल. ज़्यादा जानकारी के लिए, ड्राफ़्ट ऐप्लिकेशन' देखें अब काम नहीं करते हैं.
सर्वर रिस्पॉन्स अतिरिक्त
ऐप्लिकेशन के रिफ़ंड में, ऐप्लिकेशन का ऐक्सेस मैनेज करने में आपके ऐप्लिकेशन की मदद करने के लिए अवधि और अन्य जानकारी प्रदान करते हैं, तो लाइसेंसिंग सर्वर में में जानकारी शामिल होती है. यह सेवा खास तौर पर, ऐप्लिकेशन के लाइसेंस की वैधता अवधि, फिर से कोशिश करने की मोहलत, फिर से कोशिश करने की ज़्यादा से ज़्यादा संख्या, और अन्य सेटिंग. यदि आपका ऐप्लिकेशन APK का उपयोग करता है एक्सपैंशन फ़ाइलें अपलोड करते हैं, तो रिस्पॉन्स में फ़ाइल के नाम, साइज़, और यूआरएल भी शामिल होते हैं. सर्वर जुड़ जाता है लाइसेंस रिस्पॉन्स "अतिरिक्त" में, की-वैल्यू पेयर के तौर पर सेटिंग फ़ील्ड में डालें.
Policy
को लागू करने पर, लाइसेंस से अतिरिक्त सेटिंग एक्सट्रैक्ट की जा सकती हैं
और उनकी ज़रूरत के हिसाब से उनका इस्तेमाल करें. एलवीएल के डिफ़ॉल्ट Policy
लागू करने के तरीके, ServerManagedPolicy
का इस्तेमाल
लागू करने के बारे में बताया गया है. साथ ही, इस बात की भी जानकारी दी गई है कि
सेटिंग.
अतिरिक्त | ब्यौरा |
---|---|
VT |
लाइसेंस की वैधता का टाइमस्टैंप. वह तारीख/समय बताता है जब मौजूदा (कैश मेमोरी में सेव किया गया) लाइसेंस रिस्पॉन्स की समयसीमा खत्म हो जाती है. इसे लाइसेंस देने वाले सर्वर पर फिर से जांचना होगा. सेक्शन देखें यहां लाइसेंस की वैधता की अवधि के बारे में जानकारी दी गई है. |
GT |
ग्रेस पीरियड का टाइमस्टैंप. उस अवधि के अंत के बारे में बताता है जिसके दौरान
नीति के मुताबिक ऐप्लिकेशन को ऐक्सेस करने की अनुमति दी जा सकती है. भले ही, जवाब की स्थिति यह हो
RETRY . वैल्यू को सर्वर मैनेज करता है. हालांकि, सामान्य वैल्यू 5 होगी या ज़्यादा दिन. सेक्शन देखें फिर से कोशिश करने की अवधि और फिर से कोशिश करने की ज़्यादा से ज़्यादा संख्या के बारे में नीचे बताया गया है. |
GR |
ज़्यादा से ज़्यादा कितनी बार कोशिश की जा सकती है. इससे पता चलता है कि RETRY लाइसेंस की लगातार कितनी जांच की जाती है
उपयोगकर्ता को ऐप्लिकेशन का ऐक्सेस देने से पहले, Policy को अनुमति देनी चाहिए.
वैल्यू को सर्वर मैनेज करता है. हालांकि, सामान्य वैल्यू "10" होगी या उच्च. सेक्शन देखें फिर से कोशिश करने की अवधि और फिर से कोशिश करने की ज़्यादा से ज़्यादा संख्या के बारे में नीचे बताया गया है. |
UT |
अपडेट का टाइमस्टैंप. उस दिन/समय के बारे में बताता है जब सबसे हाल में अपडेट किया गया था
इस ऐप्लिकेशन को अपलोड और प्रकाशित किया गया था. सर्वर यह अतिरिक्त जानकारी दिखाता है
सिर्फ़ |
FILE_URL1 या FILE_URL2 |
एक्सपैंशन फ़ाइल के लिए यूआरएल (1 मुख्य फ़ाइल के लिए है और 2 पैच फ़ाइल के लिए है). इसका इस्तेमाल इसके लिए करें एचटीटीपी पर फ़ाइल डाउनलोड करें. |
FILE_NAME1 या FILE_NAME2 |
एक्सपैंशन फ़ाइल का नाम (1 मुख्य फ़ाइल के लिए है, 2 पैच फ़ाइल के लिए है). आपको इसका इस्तेमाल करना चाहिए नाम दिखाई देगा. |
FILE_SIZE1 या FILE_SIZE2 |
फ़ाइल का साइज़ बाइट में (एक मुख्य फ़ाइल के लिए और दो पैच फ़ाइल के लिए). इसका इस्तेमाल इसके लिए करें डाउनलोड करने में और यह सुनिश्चित करने में सहायता करते हैं कि डिवाइस के शेयर किए गए पर काफ़ी स्थान उपलब्ध है सेव करने की जगह तय करें. |
लाइसेंस के मान्य रहने की अवधि
Google Play लाइसेंस देने वाला सर्वर सभी के लिए लाइसेंस की वैधता अवधि सेट करता है
ऐप्लिकेशन को डाउनलोड करने के लिए किया जा सकता है. यह समयावधि उस समय के अंतराल को दिखाती है जिसमें
आवेदन के लाइसेंस की स्थिति को
ऐप्लिकेशन में, लाइसेंसिंग Policy
. लाइसेंस देने वाले सर्वर में
सभी लाइसेंस जांचों के जवाब में वैध रहने की अवधि के साथ-साथ,
VT
कुंजी के नीचे, जवाब के खत्म होने की पुष्टि का टाइमस्टैंप, अतिरिक्त के तौर पर. ऐप्लिकेशन
Policy
, वीटी कुंजी की वैल्यू को एक्सट्रैक्ट कर सकता है. साथ ही, इसका इस्तेमाल कुछ शर्तों के साथ
लाइसेंस की फिर से जांच किए बिना ऐप्लिकेशन, जब तक कि समयसीमा खत्म नहीं हो जाती
समय-सीमा खत्म.
लाइसेंस की वैधता Policy
को तब भेजी जाती है, जब उसे दोबारा जांच करनी होती है
लाइसेंस देने की स्थिति के बारे में भी बताएंगे. इसका मकसद यह नहीं बताना है कि
कि ऐप्लिकेशन इस्तेमाल करने का लाइसेंस वाकई में है या नहीं. इसका मतलब है कि जब
ऐप्लिकेशन की लाइसेंस की समयसीमा खत्म हो जाती है, इसका यह मतलब नहीं कि
ऐप्लिकेशन अब उपयोग के लिए लाइसेंसीकृत नहीं है — बल्कि, यह केवल यह बताता है कि
Policy
को सर्वर पर लाइसेंस की स्थिति की फिर से जांच करनी होगी. इसके तहत,
अगर लाइसेंस की वैधता की अवधि खत्म नहीं हुई है, तो
स्थानीय तौर पर लाइसेंस की शुरुआती स्थिति को कैश मेमोरी में सेव करने और कैश मेमोरी में सेव किए गए लाइसेंस को लौटाने के लिए Policy
स्टेटस का इस्तेमाल करें.
लाइसेंस देने वाला सर्वर, समयसीमा की अवधि को ऐप्लिकेशन के ज़रिए ऑफ़र की गई रिफ़ंड अवधि के दौरान लाइसेंसिंग की प्रक्रिया सही तरह से लागू हो पैसे चुकाकर डाउनलोड किए जाने वाले ऐप्लिकेशन के लिए Google Play. यह इन बातों के आधार पर पुष्टि की अवधि सेट करता है ऐप्लिकेशन खरीदा गया था या नहीं और अगर हां, तो कितनी देर पहले खरीदा था. खास तौर पर, सर्वर, मान्य रहने की अवधि को इस तरह सेट करता है:
- पैसे देकर इस्तेमाल किए जाने वाले ऐप्लिकेशन के लिए, सर्वर, लाइसेंस की शुरुआती समयसीमा सेट करता है
ताकि लाइसेंस रिस्पॉन्स तब तक मान्य रहे, जब तक आवेदन
रिफ़ंड किया जा सकता है. ऐप्लिकेशन में
Policy
का लाइसेंस देने से, लाइसेंस की जांच के नतीजे दिखते हैं. इस वजह से, लाइसेंस की दोबारा जांच करने की ज़रूरत नहीं पड़ती जब तक कि इसकी समयसीमा खत्म न हो जाए. - जब किसी ऐप्लिकेशन को वापस नहीं किया जा सकता, तो सर्वर लंबी वैधता अवधि सेट करता है. आम तौर पर, यह अवधि कुछ दिनों की होती है.
- मुफ़्त ऐप्लिकेशन के लिए, सर्वर वैधता अवधि को बहुत ज़्यादा पर सेट करता है
मान (
long.MAX_VALUE
). इससे यह पक्का होता है कि, बशर्तेPolicy
के पास मान्यता के टाइमस्टैंप को स्थानीय तौर पर कैश मेमोरी में सेव किया जाता है, तो इसे लाइसेंस की स्थिति.
ServerManagedPolicy
को लागू करने के लिए, एक्सट्रैक्ट किए गए टाइमस्टैंप का इस्तेमाल किया जाता है
(mValidityTimestamp
) यह तय करने के लिए पहली शर्त के रूप में
उपयोगकर्ता को
ऐप्लिकेशन खोलें.
फिर से कोशिश करने की अवधि और फिर से कोशिश करने की ज़्यादा से ज़्यादा संख्या
कुछ मामलों में, सिस्टम या नेटवर्क की शर्तें ऐप्लिकेशन की लाइसेंस की जांच को लाइसेंस देने वाले सर्वर तक पहुंचने से रोक सकते हैं, या Google Play क्लाइंट ऐप्लिकेशन तक पहुंचने से मिला जवाब. उदाहरण के लिए, सेल नेटवर्क या डेटा न होने पर, उपयोगकर्ता किसी ऐप्लिकेशन को लॉन्च कर सकता है कनेक्शन उपलब्ध हो—जैसे जब हवाई जहाज़ में हो—या जब इंटरनेट ठीक से काम नहीं कर रहा है या सेल सिग्नल कमज़ोर है.
जब नेटवर्क समस्याएं लाइसेंस की जांच को रोकती हैं या उसमें रुकावट डालती हैं, तो Google
Play क्लाइंट, इस नंबर पर RETRY
रिस्पॉन्स कोड लौटाकर ऐप्लिकेशन को इसकी सूचना देता है
Policy
का processServerResponse()
तरीका. सिस्टम के मामले में
समस्याएं, जैसे जब ऐप्लिकेशन Google Play के
ILicensingService
लागू करने पर, LicenseChecker
लाइब्रेरी
RETRY
रिस्पॉन्स कोड के साथ नीति से जुड़ा processServerResponse()
तरीका.
आम तौर पर, RETRY
रिस्पॉन्स कोड ऐप्लिकेशन को यह सिग्नल देता है कि
गड़बड़ी हुई है, जिसकी वजह से लाइसेंस की जाँच पूरी नहीं हो पाई.
Google Play सर्वर, ऐप्लिकेशन को इसके तहत लाइसेंस मैनेज करने में मदद करता है
"ग्रेस पीरियड" को फिर से सेट करने की कोशिश करें और एक सुझाई गई सीमा
एक से ज़्यादा बार कितनी बार कोशिश की गई. सर्वर इन वैल्यू को, लाइसेंस की जांच के सभी रिस्पॉन्स में शामिल करता है,
उन्हें GT
और GR
कुंजियों में अतिरिक्त के तौर पर जोड़कर.
Policy
ऐप्लिकेशन, GT
और GR
अतिरिक्त चीज़ों को एक्सट्रैक्ट कर सकता है और उनका इस्तेमाल इन कामों के लिए कर सकता है
कुछ शर्तों के साथ ऐप्लिकेशन को ऐक्सेस करने की अनुमति देने के लिए, यहां दिया गया तरीका अपनाएं:
- लाइसेंस की जांच के नतीजे के तौर पर
RETRY
से जवाब मिलता है. इस जांच के लिए,Policy
को यह करना चाहिएRETRY
रिस्पॉन्स कोड को कैश मेमोरी में सेव करें औरRETRY
रिस्पॉन्स की संख्या बढ़ाएं. Policy
से उपयोगकर्ता को ऐप्लिकेशन ऐक्सेस करने की अनुमति मिलनी चाहिए. हालांकि, इसके लिए ज़रूरी है कि या तो फिर से कोशिश करने की मोहलत अब भी चालू है या फिर से बार-बार कोशिश करने की ज़्यादा से ज़्यादा संख्या है अभी तक नहीं पहुंचा है.
ServerManagedPolicy
, सर्वर से मिली GT
और GR
वैल्यू का इस्तेमाल इस तरह करता है
ऊपर बताया गया है. नीचे दिए गए उदाहरण में, शर्तों के साथ फिर से कोशिश करने के तरीके को दिखाया गया है
allow()
तरीके में रिस्पॉन्स. RETRY
जवाबों की संख्या है
processServerResponse()
विधि में बनाए रखा गया है, नहीं दिखाया गया है.
Kotlin
fun allowAccess(): Boolean { val ts = System.currentTimeMillis() return when(lastResponse) { LICENSED -> { // Check if the LICENSED response occurred within the validity timeout. ts <= validityTimestamp // Cached LICENSED response is still valid. } RETRY -> { ts < lastResponseTime + MILLIS_PER_MINUTE && // Only allow access if we are within the retry period // or we haven't used up our max retries. (ts <= retryUntil || retryCount <= maxRetries) } else -> false } }
Java
public boolean allowAccess() { long ts = System.currentTimeMillis(); if (lastResponse == LicenseResponse.LICENSED) { // Check if the LICENSED response occurred within the validity timeout. if (ts <= validityTimestamp) { // Cached LICENSED response is still valid. return true; } } else if (lastResponse == LicenseResponse.RETRY && ts < lastResponseTime + MILLIS_PER_MINUTE) { // Only allow access if we are within the retry period // or we haven't used up our max retries. return (ts <= retryUntil || retryCount <= maxRetries); } return false; }