improved enhanced features

This commit is contained in:
Mariotaku Lee 2017-02-01 14:04:14 +08:00
parent 89b91be04b
commit 23a2325148
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
8 changed files with 91 additions and 34 deletions

View File

@ -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()
}

View File

@ -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;

View File

@ -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)

View File

@ -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 {

View File

@ -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 -> {

View File

@ -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())
}
}

View File

@ -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)
}
}
}
}

View File

@ -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>