improved enhanced features
This commit is contained in:
parent
89b91be04b
commit
23a2325148
|
@ -3,6 +3,7 @@ package org.mariotaku.twidere.util.premium
|
|||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.anjlab.android.iab.v3.BillingProcessor
|
||||
import nl.komponents.kovenant.task
|
||||
import org.mariotaku.twidere.Constants.GOOGLE_PLAY_LICENCING_PUBKEY
|
||||
import org.mariotaku.twidere.R
|
||||
import org.mariotaku.twidere.activity.GooglePlayInAppPurchaseActivity
|
||||
|
@ -23,6 +24,12 @@ class GooglePlayExtraFeaturesService : ExtraFeaturesService() {
|
|||
bp = BillingProcessor(context, GOOGLE_PLAY_LICENCING_PUBKEY, null)
|
||||
}
|
||||
|
||||
override fun appStarted() {
|
||||
task {
|
||||
bp.loadOwnedPurchasesFromGoogle()
|
||||
}
|
||||
}
|
||||
|
||||
override fun release() {
|
||||
bp.release()
|
||||
}
|
||||
|
|
|
@ -36,6 +36,8 @@ public interface Constants extends TwidereConstants {
|
|||
String DATABASES_NAME = "twidere.sqlite";
|
||||
int DATABASES_VERSION = 162;
|
||||
|
||||
int EXTRA_FEATURES_NOTICE_VERSION = 0;
|
||||
|
||||
int MENU_GROUP_STATUS_EXTENSION = 10;
|
||||
int MENU_GROUP_COMPOSE_EXTENSION = 11;
|
||||
int MENU_GROUP_IMAGE_EXTENSION = 12;
|
||||
|
|
|
@ -52,6 +52,7 @@ import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper
|
|||
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
|
||||
import org.mariotaku.twidere.util.media.TwidereMediaDownloader
|
||||
import org.mariotaku.twidere.util.net.TwidereDns
|
||||
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
|
||||
import org.mariotaku.twidere.util.refresh.AutoRefreshController
|
||||
import org.mariotaku.twidere.util.sync.SyncController
|
||||
import java.util.*
|
||||
|
@ -78,6 +79,8 @@ class TwidereApplication : Application(), Constants, OnSharedPreferenceChangeLis
|
|||
lateinit internal var autoRefreshController: AutoRefreshController
|
||||
@Inject
|
||||
lateinit internal var syncController: SyncController
|
||||
@Inject
|
||||
lateinit internal var extraFeaturesService: ExtraFeaturesService
|
||||
|
||||
override fun attachBaseContext(base: Context) {
|
||||
super.attachBaseContext(base)
|
||||
|
@ -112,6 +115,7 @@ class TwidereApplication : Application(), Constants, OnSharedPreferenceChangeLis
|
|||
|
||||
autoRefreshController.appStarted()
|
||||
syncController.appStarted()
|
||||
extraFeaturesService.appStarted()
|
||||
|
||||
registerActivityLifecycleCallbacks(activityTracker)
|
||||
|
||||
|
|
|
@ -59,6 +59,7 @@ val filterPossibilitySensitiveStatusesKey = KBooleanKey("filter_possibility_sens
|
|||
val chromeCustomTabKey = KBooleanKey("chrome_custom_tab", true)
|
||||
val usageStatisticsKey = KBooleanKey(KEY_USAGE_STATISTICS, false)
|
||||
val lightFontKey = KBooleanKey("light_font", false)
|
||||
val extraFeaturesNoticeVersionKey = KIntKey("extra_features_notice_version", 0)
|
||||
|
||||
object themeBackgroundAlphaKey : KSimpleKey<Int>(KEY_THEME_BACKGROUND_ALPHA, 0xFF) {
|
||||
override fun read(preferences: SharedPreferences): Int {
|
||||
|
|
|
@ -38,6 +38,7 @@ import android.net.Uri
|
|||
import android.os.Bundle
|
||||
import android.support.design.widget.NavigationView
|
||||
import android.support.v4.app.LoaderManager.LoaderCallbacks
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v4.content.Loader
|
||||
import android.support.v4.view.MenuItemCompat
|
||||
import android.support.v4.view.ViewPager
|
||||
|
@ -51,10 +52,9 @@ import android.view.animation.DecelerateInterpolator
|
|||
import android.widget.ImageView
|
||||
import kotlinx.android.synthetic.main.header_drawer_account_selector.view.*
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.ktextension.addOnAccountsUpdatedListenerSafe
|
||||
import org.mariotaku.ktextension.convert
|
||||
import org.mariotaku.ktextension.removeOnAccountsUpdatedListenerSafe
|
||||
import org.mariotaku.ktextension.setItemAvailability
|
||||
import org.mariotaku.kpreferences.set
|
||||
import org.mariotaku.ktextension.*
|
||||
import org.mariotaku.twidere.Constants.EXTRA_FEATURES_NOTICE_VERSION
|
||||
import org.mariotaku.twidere.R
|
||||
import org.mariotaku.twidere.TwidereConstants.*
|
||||
import org.mariotaku.twidere.activity.*
|
||||
|
@ -63,9 +63,11 @@ import org.mariotaku.twidere.annotation.AccountType
|
|||
import org.mariotaku.twidere.annotation.CustomTabType
|
||||
import org.mariotaku.twidere.annotation.Referral
|
||||
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
|
||||
import org.mariotaku.twidere.constant.extraFeaturesNoticeVersionKey
|
||||
import org.mariotaku.twidere.constant.profileImageStyleKey
|
||||
import org.mariotaku.twidere.extension.model.setActivated
|
||||
import org.mariotaku.twidere.fragment.AccountsDashboardFragment.AccountsInfo
|
||||
import org.mariotaku.twidere.graphic.BadgeDrawable
|
||||
import org.mariotaku.twidere.menu.AccountToggleProvider
|
||||
import org.mariotaku.twidere.model.AccountDetails
|
||||
import org.mariotaku.twidere.model.SupportTabSpec
|
||||
|
@ -343,6 +345,12 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
|
|||
menu.setItemAvailability(R.id.favorites, useStarsForLikes)
|
||||
menu.setItemAvailability(R.id.likes, !useStarsForLikes)
|
||||
menu.setItemAvailability(R.id.premium_features, extraFeaturesService.isSupported())
|
||||
if (preferences[extraFeaturesNoticeVersionKey] < EXTRA_FEATURES_NOTICE_VERSION) {
|
||||
val icon = ContextCompat.getDrawable(context, R.drawable.ic_action_infinity)
|
||||
val color = ContextCompat.getColor(context, R.color.material_red)
|
||||
val size = resources.getDimensionPixelSize(R.dimen.element_spacing_msmall)
|
||||
menu.setMenuItemIcon(R.id.premium_features, BadgeDrawable(icon, color, size))
|
||||
}
|
||||
var hasLists = false
|
||||
var hasGroups = false
|
||||
var hasPublicTimeline = false
|
||||
|
@ -553,6 +561,7 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
|
|||
R.id.premium_features -> {
|
||||
val intent = Intent(activity, PremiumDashboardActivity::class.java)
|
||||
startActivity(intent)
|
||||
preferences[extraFeaturesNoticeVersionKey] = EXTRA_FEATURES_NOTICE_VERSION
|
||||
closeAccountsDrawer()
|
||||
}
|
||||
R.id.settings -> {
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
package org.mariotaku.twidere.graphic
|
||||
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Rect
|
||||
import android.graphics.RectF
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.support.v7.graphics.drawable.DrawableWrapper
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 2017/2/1.
|
||||
*/
|
||||
|
||||
class BadgeDrawable(drawable: Drawable, color: Int, val badgeSize: Int) : DrawableWrapper(drawable) {
|
||||
|
||||
private val badgePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
this.color = color
|
||||
}
|
||||
private val badgeBounds = RectF()
|
||||
|
||||
override fun draw(canvas: Canvas) {
|
||||
super.draw(canvas)
|
||||
canvas.drawOval(badgeBounds, badgePaint)
|
||||
}
|
||||
|
||||
override fun onBoundsChange(bounds: Rect) {
|
||||
super.onBoundsChange(bounds)
|
||||
badgeBounds.set((bounds.right - badgeSize).toFloat(), 0f, bounds.right.toFloat(), badgeSize.toFloat())
|
||||
}
|
||||
}
|
|
@ -20,6 +20,10 @@ abstract class ExtraFeaturesService {
|
|||
this.context = context
|
||||
}
|
||||
|
||||
open fun appStarted() {
|
||||
|
||||
}
|
||||
|
||||
open fun release() {
|
||||
}
|
||||
|
||||
|
@ -39,11 +43,11 @@ abstract class ExtraFeaturesService {
|
|||
data class Introduction(val icon: Int, val description: String)
|
||||
|
||||
companion object {
|
||||
|
||||
const val FEATURE_FEATURES_PACK = "features_pack"
|
||||
const val FEATURE_FILTERS_IMPORT = "import_filters"
|
||||
const val FEATURE_FILTERS_SUBSCRIPTION = "filters_subscriptions"
|
||||
const val FEATURE_SYNC_DATA = "sync_data"
|
||||
|
||||
const val FEATURE_SCHEDULE_STATUS = "schedule_status"
|
||||
|
||||
fun newInstance(context: Context): ExtraFeaturesService {
|
||||
|
@ -68,5 +72,6 @@ abstract class ExtraFeaturesService {
|
|||
else -> throw UnsupportedOperationException(feature)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,10 +16,11 @@
|
|||
~ You should have received a copy of the GNU General Public License
|
||||
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<org.mariotaku.twidere.view.ColorLabelRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<org.mariotaku.twidere.view.ColorLabelRelativeLayout
|
||||
android:id="@+id/itemContent"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/itemContent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?selectableItemBackground"
|
||||
|
@ -45,7 +46,7 @@
|
|||
android:visibility="gone"
|
||||
tools:src="@drawable/ic_activity_action_retweet"
|
||||
tools:tint="?android:textColorSecondary"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<org.mariotaku.twidere.view.ActionIconThemedTextView
|
||||
android:id="@+id/statusInfoLabel"
|
||||
|
@ -64,7 +65,7 @@
|
|||
android:visibility="gone"
|
||||
tools:text="Retweeted by Mariotaku"
|
||||
tools:textSize="@dimen/text_size_extra_small"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<org.mariotaku.twidere.view.ProfileImageView
|
||||
android:id="@+id/profileImage"
|
||||
|
@ -82,7 +83,7 @@
|
|||
android:contentDescription="@string/profile_image"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="@drawable/ic_profile_image_twidere"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<org.mariotaku.twidere.view.BoundsImageView
|
||||
android:id="@+id/profileType"
|
||||
|
@ -95,14 +96,14 @@
|
|||
android:layout_marginEnd="@dimen/element_spacing_minus_small"
|
||||
android:layout_marginRight="@dimen/element_spacing_minus_small"
|
||||
android:scaleType="fitCenter"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<Space
|
||||
android:id="@+id/statusContentUpperSpace"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/element_spacing_normal"
|
||||
android:layout_below="@+id/statusInfoLabel"
|
||||
android:visibility="gone" />
|
||||
android:visibility="gone"/>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/statusContent"
|
||||
|
@ -127,7 +128,7 @@
|
|||
android:layout_weight="1"
|
||||
app:nv_primaryTextColor="?android:textColorPrimary"
|
||||
app:nv_primaryTextStyle="bold"
|
||||
app:nv_secondaryTextColor="?android:textColorSecondary" />
|
||||
app:nv_secondaryTextColor="?android:textColorSecondary"/>
|
||||
|
||||
<org.mariotaku.twidere.view.ShortTimeView
|
||||
android:id="@+id/time"
|
||||
|
@ -136,7 +137,7 @@
|
|||
android:layout_weight="0"
|
||||
android:textAppearance="?android:textAppearanceSmall"
|
||||
tools:text="42 mins ago"
|
||||
tools:textSize="@dimen/text_size_extra_small" />
|
||||
tools:textSize="@dimen/text_size_extra_small"/>
|
||||
|
||||
<org.mariotaku.twidere.view.IconActionView
|
||||
android:id="@+id/extraType"
|
||||
|
@ -145,7 +146,7 @@
|
|||
android:layout_weight="0"
|
||||
android:color="?android:textColorSecondary"
|
||||
tools:src="@drawable/ic_action_gallery"
|
||||
tools:tint="?android:textColorSecondary" />
|
||||
tools:tint="?android:textColorSecondary"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -161,7 +162,7 @@
|
|||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:visibility="visible"
|
||||
tools:text="@string/sample_status_text"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/mediaLabel"
|
||||
|
@ -184,7 +185,7 @@
|
|||
android:color="?android:textColorSecondary"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/ic_action_gallery"
|
||||
tools:tint="?android:textColorSecondary" />
|
||||
tools:tint="?android:textColorSecondary"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/mediaLabelText"
|
||||
|
@ -193,7 +194,7 @@
|
|||
android:layout_weight="1"
|
||||
android:text="@string/media"
|
||||
android:textAppearance="?android:textAppearanceSmall"
|
||||
android:textStyle="bold" />
|
||||
android:textStyle="bold"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -246,17 +247,15 @@
|
|||
android:layout_alignParentTop="true"
|
||||
android:gravity="center_vertical|start"
|
||||
android:orientation="horizontal"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingLeft="@dimen/element_spacing_small"
|
||||
android:paddingRight="0dp"
|
||||
android:paddingStart="@dimen/element_spacing_small"
|
||||
android:paddingTop="@dimen/element_spacing_small"
|
||||
android:visibility="gone"
|
||||
app:nv_primaryTextColor="?android:textColorPrimary"
|
||||
app:nv_primaryTextStyle="bold"
|
||||
app:nv_secondaryTextColor="?android:textColorSecondary"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<org.mariotaku.twidere.view.TimelineContentTextView
|
||||
android:id="@+id/quotedText"
|
||||
|
@ -277,7 +276,7 @@
|
|||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:visibility="gone"
|
||||
tools:text="@string/sample_status_text"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/quotedMediaLabel"
|
||||
|
@ -288,7 +287,7 @@
|
|||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_below="@+id/quotedText"
|
||||
android:layout_marginTop="@dimen/element_spacing_xsmall"
|
||||
android:layout_marginTop="@dimen/element_spacing_small"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
tools:visibility="gone">
|
||||
|
@ -300,7 +299,7 @@
|
|||
android:color="?android:textColorSecondary"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/ic_action_gallery"
|
||||
tools:tint="?android:textColorSecondary" />
|
||||
tools:tint="?android:textColorSecondary"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/quotedMediaLabelText"
|
||||
|
@ -309,7 +308,7 @@
|
|||
android:layout_weight="1"
|
||||
android:text="@string/media"
|
||||
android:textAppearance="?android:textAppearanceSmall"
|
||||
android:textStyle="bold" />
|
||||
android:textStyle="bold"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -327,7 +326,7 @@
|
|||
tools:visibility="visible">
|
||||
|
||||
<!-- Child views will be inflated if media preview enabled in ViewHolder -->
|
||||
<include layout="@layout/layout_card_media_preview" />
|
||||
<include layout="@layout/layout_card_media_preview"/>
|
||||
|
||||
</org.mariotaku.twidere.view.CardMediaContainer>
|
||||
</org.mariotaku.twidere.view.ColorLabelRelativeLayout>
|
||||
|
@ -339,7 +338,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/element_spacing_normal"
|
||||
android:layout_below="@+id/statusContent"
|
||||
android:visibility="gone" />
|
||||
android:visibility="gone"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/actionButtons"
|
||||
|
@ -375,7 +374,7 @@
|
|||
android:src="@drawable/ic_action_reply"
|
||||
app:iabActivatedColor="@color/highlight_reply"
|
||||
app:iabColor="?android:textColorTertiary"
|
||||
tools:tint="?android:textColorSecondary" />
|
||||
tools:tint="?android:textColorSecondary"/>
|
||||
|
||||
<org.mariotaku.twidere.view.ActionIconThemedTextView
|
||||
android:id="@+id/replyCount"
|
||||
|
@ -389,7 +388,7 @@
|
|||
android:maxLines="1"
|
||||
android:minHeight="@dimen/button_size_content_card_action"
|
||||
android:textAppearance="?android:textAppearanceSmall"
|
||||
tools:text="255" />
|
||||
tools:text="255"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
|
@ -414,7 +413,7 @@
|
|||
android:src="@drawable/ic_action_retweet"
|
||||
app:iabActivatedColor="@color/highlight_retweet"
|
||||
app:iabColor="?android:textColorTertiary"
|
||||
tools:tint="?android:textColorSecondary" />
|
||||
tools:tint="?android:textColorSecondary"/>
|
||||
|
||||
<org.mariotaku.twidere.view.ActionIconThemedTextView
|
||||
android:id="@+id/retweetCount"
|
||||
|
@ -428,7 +427,7 @@
|
|||
android:maxLines="1"
|
||||
android:minHeight="@dimen/button_size_content_card_action"
|
||||
android:textAppearance="?android:textAppearanceSmall"
|
||||
tools:text="255" />
|
||||
tools:text="255"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -454,7 +453,7 @@
|
|||
android:src="@drawable/ic_action_heart"
|
||||
app:iabActivatedColor="@color/highlight_like"
|
||||
app:iabColor="?android:textColorTertiary"
|
||||
tools:tint="?android:textColorSecondary" />
|
||||
tools:tint="?android:textColorSecondary"/>
|
||||
|
||||
<org.mariotaku.twidere.view.ActionIconThemedTextView
|
||||
android:id="@+id/favoriteCount"
|
||||
|
@ -468,7 +467,7 @@
|
|||
android:maxLines="1"
|
||||
android:minHeight="@dimen/button_size_content_card_action"
|
||||
android:textAppearance="?android:textAppearanceSmall"
|
||||
tools:text="255" />
|
||||
tools:text="255"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -484,6 +483,6 @@
|
|||
android:focusable="false"
|
||||
android:src="@drawable/ic_action_more_horizontal"
|
||||
tools:tint="?android:textColorSecondary"
|
||||
tools:visibility="visible" />
|
||||
tools:visibility="visible"/>
|
||||
|
||||
</org.mariotaku.twidere.view.ColorLabelRelativeLayout>
|
Loading…
Reference in New Issue