improved analyzer events
This commit is contained in:
parent
1aa3ac349c
commit
ac7af6abac
|
@ -208,5 +208,5 @@ public interface IntentConstants {
|
||||||
String EXTRA_SIMPLE_LAYOUT = "simple_layout";
|
String EXTRA_SIMPLE_LAYOUT = "simple_layout";
|
||||||
String EXTRA_API_CONFIG = "api_config";
|
String EXTRA_API_CONFIG = "api_config";
|
||||||
String EXTRA_COUNT = "count";
|
String EXTRA_COUNT = "count";
|
||||||
|
String EXTRA_REQUEST_CODE = "request_code";
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,15 @@ import android.os.Bundle
|
||||||
import android.support.v4.app.DialogFragment
|
import android.support.v4.app.DialogFragment
|
||||||
import com.anjlab.android.iab.v3.BillingProcessor
|
import com.anjlab.android.iab.v3.BillingProcessor
|
||||||
import com.anjlab.android.iab.v3.Constants.*
|
import com.anjlab.android.iab.v3.Constants.*
|
||||||
|
import com.anjlab.android.iab.v3.SkuDetails
|
||||||
import com.anjlab.android.iab.v3.TransactionDetails
|
import com.anjlab.android.iab.v3.TransactionDetails
|
||||||
import nl.komponents.kovenant.task
|
import nl.komponents.kovenant.task
|
||||||
import nl.komponents.kovenant.ui.alwaysUi
|
import nl.komponents.kovenant.ui.alwaysUi
|
||||||
import nl.komponents.kovenant.ui.failUi
|
import nl.komponents.kovenant.ui.failUi
|
||||||
import nl.komponents.kovenant.ui.successUi
|
import nl.komponents.kovenant.ui.successUi
|
||||||
import org.mariotaku.twidere.Constants
|
import org.mariotaku.twidere.Constants
|
||||||
|
import org.mariotaku.twidere.constant.EXTRA_CURRENCY
|
||||||
|
import org.mariotaku.twidere.constant.EXTRA_PRICE
|
||||||
import org.mariotaku.twidere.constant.IntentConstants.INTENT_PACKAGE_PREFIX
|
import org.mariotaku.twidere.constant.IntentConstants.INTENT_PACKAGE_PREFIX
|
||||||
import org.mariotaku.twidere.constant.RESULT_NOT_PURCHASED
|
import org.mariotaku.twidere.constant.RESULT_NOT_PURCHASED
|
||||||
import org.mariotaku.twidere.constant.RESULT_SERVICE_UNAVAILABLE
|
import org.mariotaku.twidere.constant.RESULT_SERVICE_UNAVAILABLE
|
||||||
|
@ -82,8 +85,9 @@ class GooglePlayInAppPurchaseActivity : BaseActivity(), BillingProcessor.IBillin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handlePurchased(details: TransactionDetails) {
|
private fun handlePurchased(sku: SkuDetails, transaction: TransactionDetails) {
|
||||||
setResult(RESULT_OK)
|
val data = Intent().putExtra(EXTRA_PRICE, sku.priceValue).putExtra(EXTRA_CURRENCY, sku.currency)
|
||||||
|
setResult(RESULT_OK, data)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,11 +97,16 @@ class GooglePlayInAppPurchaseActivity : BaseActivity(), BillingProcessor.IBillin
|
||||||
val dfRef = WeakReference(ProgressDialogFragment.show(it.supportFragmentManager, "consume_purchase_progress"))
|
val dfRef = WeakReference(ProgressDialogFragment.show(it.supportFragmentManager, "consume_purchase_progress"))
|
||||||
task {
|
task {
|
||||||
val activity = weakThis.get() ?: throw PurchaseException(BILLING_RESPONSE_RESULT_USER_CANCELED)
|
val activity = weakThis.get() ?: throw PurchaseException(BILLING_RESPONSE_RESULT_USER_CANCELED)
|
||||||
activity.billingProcessor.loadOwnedPurchasesFromGoogle()
|
val productId = activity.productId
|
||||||
val details = activity.billingProcessor.getPurchaseTransactionDetails(activity.productId)
|
val bp = activity.billingProcessor
|
||||||
return@task details ?: throw PurchaseException(BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED)
|
bp.loadOwnedPurchasesFromGoogle()
|
||||||
}.successUi { details ->
|
val skuDetails = bp.getPurchaseListingDetails(productId)
|
||||||
weakThis.get()?.handlePurchased(details)
|
?: throw PurchaseException(BILLING_RESPONSE_RESULT_ERROR)
|
||||||
|
val transactionDetails = bp.getPurchaseTransactionDetails(productId)
|
||||||
|
?: throw PurchaseException(BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED)
|
||||||
|
return@task Pair(skuDetails, transactionDetails)
|
||||||
|
}.successUi { result ->
|
||||||
|
weakThis.get()?.handlePurchased(result.first, result.second)
|
||||||
}.failUi { error ->
|
}.failUi { error ->
|
||||||
if (error is PurchaseException) {
|
if (error is PurchaseException) {
|
||||||
weakThis.get()?.handleError(error.code)
|
weakThis.get()?.handleError(error.code)
|
||||||
|
@ -122,10 +131,13 @@ class GooglePlayInAppPurchaseActivity : BaseActivity(), BillingProcessor.IBillin
|
||||||
val activity = weakThis.get() ?: throw PurchaseException(BILLING_RESPONSE_RESULT_USER_CANCELED)
|
val activity = weakThis.get() ?: throw PurchaseException(BILLING_RESPONSE_RESULT_USER_CANCELED)
|
||||||
val bp = activity.billingProcessor
|
val bp = activity.billingProcessor
|
||||||
bp.loadOwnedPurchasesFromGoogle()
|
bp.loadOwnedPurchasesFromGoogle()
|
||||||
val result = bp.getPurchaseTransactionDetails(activity.productId)
|
val skuDetails = bp.getPurchaseListingDetails(productId)
|
||||||
return@task result ?: throw PurchaseException(BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED)
|
?: throw PurchaseException(BILLING_RESPONSE_RESULT_ERROR)
|
||||||
}.successUi { details ->
|
val transactionDetails = bp.getPurchaseTransactionDetails(productId)
|
||||||
weakThis.get()?.handlePurchased(details)
|
?: throw PurchaseException(BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED)
|
||||||
|
return@task Pair(skuDetails, transactionDetails)
|
||||||
|
}.successUi { result ->
|
||||||
|
weakThis.get()?.handlePurchased(result.first, result.second)
|
||||||
}.failUi { error ->
|
}.failUi { error ->
|
||||||
if (error is PurchaseException) {
|
if (error is PurchaseException) {
|
||||||
weakThis.get()?.handleError(error.code)
|
weakThis.get()?.handleError(error.code)
|
||||||
|
@ -149,6 +161,7 @@ class GooglePlayInAppPurchaseActivity : BaseActivity(), BillingProcessor.IBillin
|
||||||
BILLING_RESPONSE_RESULT_USER_CANCELED -> Activity.RESULT_CANCELED
|
BILLING_RESPONSE_RESULT_USER_CANCELED -> Activity.RESULT_CANCELED
|
||||||
BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE -> RESULT_SERVICE_UNAVAILABLE
|
BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE -> RESULT_SERVICE_UNAVAILABLE
|
||||||
BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED -> RESULT_NOT_PURCHASED
|
BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED -> RESULT_NOT_PURCHASED
|
||||||
|
BILLING_RESPONSE_RESULT_ERROR -> RESULT_NOT_PURCHASED
|
||||||
else -> billingResponse
|
else -> billingResponse
|
||||||
}
|
}
|
||||||
return resultCode
|
return resultCode
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.mariotaku.twidere.util
|
||||||
import android.accounts.Account
|
import android.accounts.Account
|
||||||
import android.accounts.AccountManager
|
import android.accounts.AccountManager
|
||||||
import android.accounts.OnAccountsUpdateListener
|
import android.accounts.OnAccountsUpdateListener
|
||||||
|
import android.app.Activity
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
|
@ -32,9 +33,12 @@ import org.mariotaku.ktextension.configure
|
||||||
import org.mariotaku.twidere.BuildConfig
|
import org.mariotaku.twidere.BuildConfig
|
||||||
import org.mariotaku.twidere.Constants
|
import org.mariotaku.twidere.Constants
|
||||||
import org.mariotaku.twidere.TwidereConstants.ACCOUNT_TYPE
|
import org.mariotaku.twidere.TwidereConstants.ACCOUNT_TYPE
|
||||||
|
import org.mariotaku.twidere.model.analyzer.Purchase
|
||||||
import org.mariotaku.twidere.model.analyzer.Search
|
import org.mariotaku.twidere.model.analyzer.Search
|
||||||
import org.mariotaku.twidere.model.analyzer.Share
|
import org.mariotaku.twidere.model.analyzer.Share
|
||||||
import org.mariotaku.twidere.model.analyzer.SignIn
|
import org.mariotaku.twidere.model.analyzer.SignIn
|
||||||
|
import java.math.BigDecimal
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mariotaku on 15/7/8.
|
* Created by mariotaku on 15/7/8.
|
||||||
|
@ -81,6 +85,20 @@ class FabricAnalyzer : Analyzer(), Constants {
|
||||||
putAttributes(event)
|
putAttributes(event)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
is Purchase -> {
|
||||||
|
answers.logPurchase(configure(PurchaseEvent()) {
|
||||||
|
putItemName(event.productName)
|
||||||
|
putSuccess(event.resultCode == Activity.RESULT_OK)
|
||||||
|
if (!event.price.isNaN() && event.currency != null) {
|
||||||
|
putCurrency(Currency.getInstance(event.currency) ?: Currency.getInstance(Locale.getDefault()))
|
||||||
|
putItemPrice(BigDecimal(event.price))
|
||||||
|
}
|
||||||
|
event.forEachValues { name, value ->
|
||||||
|
putCustomAttribute(name, value)
|
||||||
|
}
|
||||||
|
putAttributes(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
else -> {
|
else -> {
|
||||||
answers.logCustom(configure(CustomEvent(event.name)) {
|
answers.logCustom(configure(CustomEvent(event.name)) {
|
||||||
putAttributes(event)
|
putAttributes(event)
|
||||||
|
|
|
@ -108,6 +108,9 @@ public interface Constants extends TwidereConstants {
|
||||||
@Preference(type = STRING, exportable = false)
|
@Preference(type = STRING, exportable = false)
|
||||||
String KEY_DEVICE_SERIAL = "device_serial";
|
String KEY_DEVICE_SERIAL = "device_serial";
|
||||||
|
|
||||||
|
// Intent constants
|
||||||
|
String EXTRA_PRODUCT_TYPE = "product_type";
|
||||||
|
|
||||||
@SuppressWarnings("SpellCheckingInspection")
|
@SuppressWarnings("SpellCheckingInspection")
|
||||||
String GOOGLE_APIS_SERVER_CLIENT_ID = "223623398518-1p34hsndj7couh2c9c2f8909amh9euhf.apps.googleusercontent.com";
|
String GOOGLE_APIS_SERVER_CLIENT_ID = "223623398518-1p34hsndj7couh2c9c2f8909amh9euhf.apps.googleusercontent.com";
|
||||||
@SuppressWarnings("SpellCheckingInspection")
|
@SuppressWarnings("SpellCheckingInspection")
|
||||||
|
|
|
@ -4,4 +4,8 @@ package org.mariotaku.twidere.constant
|
||||||
* Created by mariotaku on 2017/1/1.
|
* Created by mariotaku on 2017/1/1.
|
||||||
*/
|
*/
|
||||||
const val RESULT_SERVICE_UNAVAILABLE = 1
|
const val RESULT_SERVICE_UNAVAILABLE = 1
|
||||||
|
const val RESULT_INTERNAL_ERROR = 6
|
||||||
const val RESULT_NOT_PURCHASED = 8
|
const val RESULT_NOT_PURCHASED = 8
|
||||||
|
|
||||||
|
const val EXTRA_PRICE = "price"
|
||||||
|
const val EXTRA_CURRENCY = "currency"
|
|
@ -242,3 +242,11 @@ private class BodyPartHandler(private val context: Context, private val draft: D
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun draftActionTypeString(@Draft.Action action: String?): String {
|
||||||
|
return when (action) {
|
||||||
|
Draft.Action.QUOTE -> "quote"
|
||||||
|
Draft.Action.REPLY -> "reply"
|
||||||
|
else -> "tweet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.mariotaku.twidere.extension.model
|
||||||
|
|
||||||
|
import org.mariotaku.twidere.model.ParcelableMedia
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mariotaku on 2017/1/7.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fun parcelableMediaTypeString(@ParcelableMedia.Type type: Int): String {
|
||||||
|
if (type <= 0) return "none"
|
||||||
|
return when (type) {
|
||||||
|
ParcelableMedia.Type.IMAGE -> "image"
|
||||||
|
ParcelableMedia.Type.VIDEO -> "video"
|
||||||
|
ParcelableMedia.Type.ANIMATED_GIF -> "gif"
|
||||||
|
ParcelableMedia.Type.CARD_ANIMATED_GIF -> "gif"
|
||||||
|
ParcelableMedia.Type.EXTERNAL_PLAYER -> "external"
|
||||||
|
ParcelableMedia.Type.VARIABLE_TYPE -> "variable"
|
||||||
|
else -> "unknown"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package org.mariotaku.twidere.extension.model
|
||||||
|
|
||||||
|
import org.mariotaku.twidere.model.ParcelableStatus
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mariotaku on 2017/1/7.
|
||||||
|
*/
|
||||||
|
val ParcelableStatus.media_type: Int
|
||||||
|
get() = (media ?: quoted_media)?.firstOrNull()?.type ?: 0
|
|
@ -5,6 +5,7 @@ import android.os.Bundle
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import org.mariotaku.twidere.R
|
import org.mariotaku.twidere.R
|
||||||
|
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_REQUEST_CODE
|
||||||
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
|
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,7 +27,15 @@ class ExtraFeaturesIntroductionDialogFragment : BaseDialogFragment() {
|
||||||
builder.setTitle(R.string.title_extra_features)
|
builder.setTitle(R.string.title_extra_features)
|
||||||
builder.setView(R.layout.dialog_extra_features_introduction)
|
builder.setView(R.layout.dialog_extra_features_introduction)
|
||||||
builder.setPositiveButton(R.string.action_purchase) { dialog, which ->
|
builder.setPositiveButton(R.string.action_purchase) { dialog, which ->
|
||||||
startActivity(extraFeaturesService.createPurchaseIntent(context))
|
val requestCode = arguments?.getInt(EXTRA_REQUEST_CODE) ?: 0
|
||||||
|
val purchaseIntent = extraFeaturesService.createPurchaseIntent(context)
|
||||||
|
if (requestCode == 0) {
|
||||||
|
startActivity(purchaseIntent)
|
||||||
|
} else if (parentFragment != null) {
|
||||||
|
parentFragment.startActivityForResult(purchaseIntent, requestCode)
|
||||||
|
} else {
|
||||||
|
activity.startActivityForResult(purchaseIntent, requestCode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
builder.setNegativeButton(R.string.action_later) { dialog, which ->
|
builder.setNegativeButton(R.string.action_later) { dialog, which ->
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,7 @@ import android.support.v7.app.AlertDialog
|
||||||
import org.mariotaku.ktextension.Bundle
|
import org.mariotaku.ktextension.Bundle
|
||||||
import org.mariotaku.ktextension.set
|
import org.mariotaku.ktextension.set
|
||||||
import org.mariotaku.twidere.R
|
import org.mariotaku.twidere.R
|
||||||
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_MESSAGE
|
import org.mariotaku.twidere.constant.IntentConstants.*
|
||||||
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_PERMISSIONS
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mariotaku on 2016/12/13.
|
* Created by mariotaku on 2016/12/13.
|
||||||
|
@ -36,7 +35,7 @@ class PermissionRequestDialog : BaseDialogFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val EXTRA_REQUEST_CODE = "request_code"
|
|
||||||
fun show(fragmentManager: FragmentManager, message: String, permissions: Array<String>, requestCode: Int): PermissionRequestDialog {
|
fun show(fragmentManager: FragmentManager, message: String, permissions: Array<String>, requestCode: Int): PermissionRequestDialog {
|
||||||
val df = PermissionRequestDialog()
|
val df = PermissionRequestDialog()
|
||||||
df.arguments = Bundle {
|
df.arguments = Bundle {
|
||||||
|
|
|
@ -91,11 +91,13 @@ import org.mariotaku.twidere.annotation.Referral
|
||||||
import org.mariotaku.twidere.constant.*
|
import org.mariotaku.twidere.constant.*
|
||||||
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
|
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
|
||||||
import org.mariotaku.twidere.extension.model.getAccountType
|
import org.mariotaku.twidere.extension.model.getAccountType
|
||||||
|
import org.mariotaku.twidere.extension.model.media_type
|
||||||
import org.mariotaku.twidere.loader.ConversationLoader
|
import org.mariotaku.twidere.loader.ConversationLoader
|
||||||
import org.mariotaku.twidere.loader.ParcelableStatusLoader
|
import org.mariotaku.twidere.loader.ParcelableStatusLoader
|
||||||
import org.mariotaku.twidere.menu.FavoriteItemProvider
|
import org.mariotaku.twidere.menu.FavoriteItemProvider
|
||||||
import org.mariotaku.twidere.model.*
|
import org.mariotaku.twidere.model.*
|
||||||
import org.mariotaku.twidere.model.analyzer.Share
|
import org.mariotaku.twidere.model.analyzer.Share
|
||||||
|
import org.mariotaku.twidere.model.analyzer.StatusView
|
||||||
import org.mariotaku.twidere.model.message.FavoriteTaskEvent
|
import org.mariotaku.twidere.model.message.FavoriteTaskEvent
|
||||||
import org.mariotaku.twidere.model.message.StatusListChangedEvent
|
import org.mariotaku.twidere.model.message.StatusListChangedEvent
|
||||||
import org.mariotaku.twidere.model.util.*
|
import org.mariotaku.twidere.model.util.*
|
||||||
|
@ -208,7 +210,7 @@ class StatusFragment : BaseSupportFragment(), LoaderCallbacks<SingleResponse<Par
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val mStatusActivityLoaderCallback = object : LoaderCallbacks<StatusActivity?> {
|
private val statusActivityLoaderCallback = object : LoaderCallbacks<StatusActivity?> {
|
||||||
override fun onCreateLoader(id: Int, args: Bundle): Loader<StatusActivity?> {
|
override fun onCreateLoader(id: Int, args: Bundle): Loader<StatusActivity?> {
|
||||||
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
|
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
|
||||||
val statusId = args.getString(EXTRA_STATUS_ID)
|
val statusId = args.getString(EXTRA_STATUS_ID)
|
||||||
|
@ -435,6 +437,7 @@ class StatusFragment : BaseSupportFragment(), LoaderCallbacks<SingleResponse<Par
|
||||||
event.isHasTranslateFeature = false
|
event.isHasTranslateFeature = false
|
||||||
}
|
}
|
||||||
statusEvent = event
|
statusEvent = event
|
||||||
|
Analyzer.log(StatusView(details?.type, status.media_type))
|
||||||
} else if (readPosition != null) {
|
} else if (readPosition != null) {
|
||||||
restoreReadPosition(readPosition)
|
restoreReadPosition(readPosition)
|
||||||
}
|
}
|
||||||
|
@ -539,10 +542,10 @@ class StatusFragment : BaseSupportFragment(), LoaderCallbacks<SingleResponse<Par
|
||||||
args.putParcelable(EXTRA_ACCOUNT_KEY, status.account_key)
|
args.putParcelable(EXTRA_ACCOUNT_KEY, status.account_key)
|
||||||
args.putString(EXTRA_STATUS_ID, if (status.is_retweet) status.retweet_id else status.id)
|
args.putString(EXTRA_STATUS_ID, if (status.is_retweet) status.retweet_id else status.id)
|
||||||
if (mActivityLoaderInitialized) {
|
if (mActivityLoaderInitialized) {
|
||||||
loaderManager.restartLoader(LOADER_ID_STATUS_ACTIVITY, args, mStatusActivityLoaderCallback)
|
loaderManager.restartLoader(LOADER_ID_STATUS_ACTIVITY, args, statusActivityLoaderCallback)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
loaderManager.initLoader(LOADER_ID_STATUS_ACTIVITY, args, mStatusActivityLoaderCallback)
|
loaderManager.initLoader(LOADER_ID_STATUS_ACTIVITY, args, statusActivityLoaderCallback)
|
||||||
mActivityLoaderInitialized = true
|
mActivityLoaderInitialized = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,6 @@ import android.widget.AutoCompleteTextView
|
||||||
import android.widget.ListView
|
import android.widget.ListView
|
||||||
import kotlinx.android.synthetic.main.fragment_content_listview.*
|
import kotlinx.android.synthetic.main.fragment_content_listview.*
|
||||||
import org.mariotaku.ktextension.setGroupAvailability
|
import org.mariotaku.ktextension.setGroupAvailability
|
||||||
import org.mariotaku.ktextension.setItemAvailability
|
|
||||||
import org.mariotaku.sqliteqb.library.Columns
|
import org.mariotaku.sqliteqb.library.Columns
|
||||||
import org.mariotaku.sqliteqb.library.Expression
|
import org.mariotaku.sqliteqb.library.Expression
|
||||||
import org.mariotaku.twidere.R
|
import org.mariotaku.twidere.R
|
||||||
|
@ -298,5 +297,6 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment<SimpleCursorAdap
|
||||||
internal const val REQUEST_ADD_USER_SELECT_ACCOUNT = 201
|
internal const val REQUEST_ADD_USER_SELECT_ACCOUNT = 201
|
||||||
internal const val REQUEST_IMPORT_BLOCKS_SELECT_ACCOUNT = 202
|
internal const val REQUEST_IMPORT_BLOCKS_SELECT_ACCOUNT = 202
|
||||||
internal const val REQUEST_IMPORT_MUTES_SELECT_ACCOUNT = 203
|
internal const val REQUEST_IMPORT_MUTES_SELECT_ACCOUNT = 203
|
||||||
|
internal const val REQUEST_PURCHASE_EXTRA_FEATURES = 211
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import org.mariotaku.kpreferences.KPreferences
|
import org.mariotaku.kpreferences.KPreferences
|
||||||
|
import org.mariotaku.ktextension.Bundle
|
||||||
import org.mariotaku.ktextension.setItemAvailability
|
import org.mariotaku.ktextension.setItemAvailability
|
||||||
import org.mariotaku.sqliteqb.library.Expression
|
import org.mariotaku.sqliteqb.library.Expression
|
||||||
import org.mariotaku.twidere.R
|
import org.mariotaku.twidere.R
|
||||||
|
@ -21,12 +22,15 @@ import org.mariotaku.twidere.activity.AccountSelectorActivity
|
||||||
import org.mariotaku.twidere.activity.LinkHandlerActivity
|
import org.mariotaku.twidere.activity.LinkHandlerActivity
|
||||||
import org.mariotaku.twidere.activity.UserListSelectorActivity
|
import org.mariotaku.twidere.activity.UserListSelectorActivity
|
||||||
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_HOST
|
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_HOST
|
||||||
|
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_REQUEST_CODE
|
||||||
import org.mariotaku.twidere.constant.nameFirstKey
|
import org.mariotaku.twidere.constant.nameFirstKey
|
||||||
import org.mariotaku.twidere.fragment.ExtraFeaturesIntroductionDialogFragment
|
import org.mariotaku.twidere.fragment.ExtraFeaturesIntroductionDialogFragment
|
||||||
import org.mariotaku.twidere.model.ParcelableUser
|
import org.mariotaku.twidere.model.ParcelableUser
|
||||||
import org.mariotaku.twidere.model.UserKey
|
import org.mariotaku.twidere.model.UserKey
|
||||||
import org.mariotaku.twidere.model.`FiltersData$UserItemCursorIndices`
|
import org.mariotaku.twidere.model.`FiltersData$UserItemCursorIndices`
|
||||||
|
import org.mariotaku.twidere.model.analyzer.Purchase
|
||||||
import org.mariotaku.twidere.provider.TwidereDataStore
|
import org.mariotaku.twidere.provider.TwidereDataStore
|
||||||
|
import org.mariotaku.twidere.util.Analyzer
|
||||||
import org.mariotaku.twidere.util.ContentValuesCreator
|
import org.mariotaku.twidere.util.ContentValuesCreator
|
||||||
import org.mariotaku.twidere.util.UserColorNameManager
|
import org.mariotaku.twidere.util.UserColorNameManager
|
||||||
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
|
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
|
||||||
|
@ -86,6 +90,9 @@ class FilteredUsersFragment : BaseFiltersFragment() {
|
||||||
intent.putExtra(EXTRA_ACCOUNT_KEY, data!!.getParcelableExtra<UserKey>(EXTRA_ACCOUNT_KEY))
|
intent.putExtra(EXTRA_ACCOUNT_KEY, data!!.getParcelableExtra<UserKey>(EXTRA_ACCOUNT_KEY))
|
||||||
startActivityForResult(intent, REQUEST_ADD_USER_SELECT_ACCOUNT)
|
startActivityForResult(intent, REQUEST_ADD_USER_SELECT_ACCOUNT)
|
||||||
}
|
}
|
||||||
|
REQUEST_PURCHASE_EXTRA_FEATURES -> {
|
||||||
|
Analyzer.log(Purchase.fromActivityResult(Purchase.NAME_EXTRA_FEATURES, resultCode, data))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,6 +130,9 @@ class FilteredUsersFragment : BaseFiltersFragment() {
|
||||||
startActivityForResult(intent, requestCode)
|
startActivityForResult(intent, requestCode)
|
||||||
} else {
|
} else {
|
||||||
val df = ExtraFeaturesIntroductionDialogFragment()
|
val df = ExtraFeaturesIntroductionDialogFragment()
|
||||||
|
df.arguments = Bundle {
|
||||||
|
putInt(EXTRA_REQUEST_CODE, REQUEST_PURCHASE_EXTRA_FEATURES)
|
||||||
|
}
|
||||||
df.show(childFragmentManager, "extra_features_introduction")
|
df.show(childFragmentManager, "extra_features_introduction")
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -13,6 +13,8 @@ import org.mariotaku.twidere.R
|
||||||
import org.mariotaku.twidere.constant.RESULT_NOT_PURCHASED
|
import org.mariotaku.twidere.constant.RESULT_NOT_PURCHASED
|
||||||
import org.mariotaku.twidere.constant.RESULT_SERVICE_UNAVAILABLE
|
import org.mariotaku.twidere.constant.RESULT_SERVICE_UNAVAILABLE
|
||||||
import org.mariotaku.twidere.fragment.BaseSupportFragment
|
import org.mariotaku.twidere.fragment.BaseSupportFragment
|
||||||
|
import org.mariotaku.twidere.model.analyzer.Purchase
|
||||||
|
import org.mariotaku.twidere.util.Analyzer
|
||||||
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
|
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -50,7 +52,12 @@ class ExtraFeaturesIntroductionCardFragment : BaseSupportFragment() {
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
when (requestCode) {
|
when (requestCode) {
|
||||||
REQUEST_PURCHASE -> {
|
REQUEST_PURCHASE -> {
|
||||||
activity?.recreate()
|
Analyzer.log(Purchase.fromActivityResult(Purchase.NAME_EXTRA_FEATURES, resultCode, data))
|
||||||
|
when (resultCode) {
|
||||||
|
Activity.RESULT_OK -> {
|
||||||
|
activity?.recreate()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
REQUEST_RESTORE_PURCHASE -> {
|
REQUEST_RESTORE_PURCHASE -> {
|
||||||
when (resultCode) {
|
when (resultCode) {
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
package org.mariotaku.twidere.model.analyzer
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import org.mariotaku.twidere.constant.*
|
||||||
|
import org.mariotaku.twidere.util.Analyzer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mariotaku on 2017/1/7.
|
||||||
|
*/
|
||||||
|
|
||||||
|
data class Purchase(val productName: String) : Analyzer.Event {
|
||||||
|
override val name: String = "Purchase"
|
||||||
|
override var accountType: String? = null
|
||||||
|
var resultCode: Int = Activity.RESULT_OK
|
||||||
|
var price: Double = Double.NaN
|
||||||
|
var currency: String? = null
|
||||||
|
|
||||||
|
override fun forEachValues(action: (String, String?) -> Unit) {
|
||||||
|
if (resultCode != Activity.RESULT_OK) {
|
||||||
|
action("Fail reason", getFailReason(resultCode))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val NAME_EXTRA_FEATURES = "Enhanced Features"
|
||||||
|
|
||||||
|
internal fun getFailReason(resultCode: Int): String {
|
||||||
|
return when (resultCode) {
|
||||||
|
Activity.RESULT_CANCELED -> "cancelled"
|
||||||
|
RESULT_SERVICE_UNAVAILABLE -> "service unavailable"
|
||||||
|
RESULT_INTERNAL_ERROR -> "internal error"
|
||||||
|
RESULT_NOT_PURCHASED -> "not purchased"
|
||||||
|
else -> "unknown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun fromActivityResult(name: String, resultCode: Int, data: Intent?): Purchase {
|
||||||
|
val result = Purchase(name)
|
||||||
|
result.resultCode = resultCode
|
||||||
|
if (data != null) {
|
||||||
|
result.price = data.getDoubleExtra(EXTRA_PRICE, Double.NaN)
|
||||||
|
result.currency = data.getStringExtra(EXTRA_CURRENCY)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.mariotaku.twidere.model.analyzer
|
||||||
|
|
||||||
|
import org.mariotaku.twidere.annotation.AccountType
|
||||||
|
import org.mariotaku.twidere.extension.model.parcelableMediaTypeString
|
||||||
|
import org.mariotaku.twidere.model.ParcelableMedia
|
||||||
|
import org.mariotaku.twidere.util.Analyzer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by mariotaku on 2017/1/7.
|
||||||
|
*/
|
||||||
|
|
||||||
|
data class StatusView(
|
||||||
|
@AccountType override val accountType: String? = null,
|
||||||
|
@ParcelableMedia.Type val mediaType: Int
|
||||||
|
) : Analyzer.Event {
|
||||||
|
|
||||||
|
override val name: String = "Status View"
|
||||||
|
|
||||||
|
override fun forEachValues(action: (String, String?) -> Unit) {
|
||||||
|
action("Media Type", parcelableMediaTypeString(mediaType))
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
package org.mariotaku.twidere.model.analyzer
|
package org.mariotaku.twidere.model.analyzer
|
||||||
|
|
||||||
import org.mariotaku.twidere.annotation.AccountType
|
import org.mariotaku.twidere.annotation.AccountType
|
||||||
|
import org.mariotaku.twidere.extension.model.draftActionTypeString
|
||||||
|
import org.mariotaku.twidere.extension.model.parcelableMediaTypeString
|
||||||
import org.mariotaku.twidere.model.Draft
|
import org.mariotaku.twidere.model.Draft
|
||||||
import org.mariotaku.twidere.model.ParcelableMedia
|
import org.mariotaku.twidere.model.ParcelableMedia
|
||||||
import org.mariotaku.twidere.util.Analyzer
|
import org.mariotaku.twidere.util.Analyzer
|
||||||
|
@ -30,29 +32,10 @@ data class UpdateStatus(
|
||||||
get() = "Tweet"
|
get() = "Tweet"
|
||||||
|
|
||||||
override fun forEachValues(action: (String, String?) -> Unit) {
|
override fun forEachValues(action: (String, String?) -> Unit) {
|
||||||
action("Status Type", actionTypeString(actionType))
|
action("Status Type", draftActionTypeString(actionType))
|
||||||
action("Media Type", mediaTypeString(mediaType))
|
action("Media Type", parcelableMediaTypeString(mediaType))
|
||||||
action("Location Type", locationType)
|
action("Location Type", locationType)
|
||||||
action("Success", success.toString())
|
action("Success", success.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun actionTypeString(@Draft.Action action: String?): String {
|
|
||||||
return when (action) {
|
|
||||||
Draft.Action.QUOTE -> "quote"
|
|
||||||
Draft.Action.REPLY -> "reply"
|
|
||||||
else -> "tweet"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun mediaTypeString(@ParcelableMedia.Type type: Int): String {
|
|
||||||
return when (type) {
|
|
||||||
ParcelableMedia.Type.IMAGE -> "image"
|
|
||||||
ParcelableMedia.Type.VIDEO -> "video"
|
|
||||||
ParcelableMedia.Type.ANIMATED_GIF -> "gif"
|
|
||||||
ParcelableMedia.Type.CARD_ANIMATED_GIF -> "gif"
|
|
||||||
ParcelableMedia.Type.EXTERNAL_PLAYER -> "external"
|
|
||||||
ParcelableMedia.Type.VARIABLE_TYPE -> "variable"
|
|
||||||
else -> "unknown"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue