package org.petabytes.awesomeblogs; import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.widget.DrawerLayout; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.View; import android.widget.TextView; import com.f2prateek.rx.preferences.Preference; import org.petabytes.awesomeblogs.digest.Schedulers; import org.petabytes.awesomeblogs.util.Preferences; import org.petabytes.coordinator.Coordinator; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeUnit; import butterknife.BindView; import butterknife.OnClick; import rx.Observable; import rx.subjects.BehaviorSubject; class DebugCoordinator extends Coordinator { @BindView(R.id.name) TextView nameView; @BindView(R.id.email) TextView emailView; @BindView(R.id.uid) TextView uidView; @BindView(R.id.fcm_token) TextView fcmTokenView; @BindView(R.id.access_token) TextView accessTokenView; @BindView(R.id.device_id) TextView deviceIdView; @BindView(R.id.git_sha) TextView gitShaView; @BindView(R.id.build_date) TextView buildDateView; @BindView(R.id.build_type) TextView buildTypeView; @BindView(R.id.build_flavor) TextView buildFlavorView; @BindView(R.id.version) TextView versionView; @BindView(R.id.make) TextView makeView; @BindView(R.id.model) TextView modelView; @BindView(R.id.resolution) TextView resolutionView; @BindView(R.id.density) TextView densityView; @BindView(R.id.release) TextView releaseView; @BindView(R.id.api) TextView apiView; @BindView(R.id.morning) TextView morningView; @BindView(R.id.evening) TextView eveningView; @BindView(R.id.all) TextView allView; @BindView(R.id.developer) TextView developerView; @BindView(R.id.company) TextView companyView; @BindView(R.id.insightful) TextView insightfulView; private final Context context; private final BehaviorSubject<Boolean> drawerOpenedSubject; DebugCoordinator(@NonNull Context context, @NonNull DrawerLayout drawerLayout) { this.context = context; this.drawerOpenedSubject = BehaviorSubject.create(); drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerOpened(View drawerView) { drawerOpenedSubject.onNext(true); } }); } @Override public void attach(View view) { super.attach(view); initAccountSection(); initFcmSection(); initAppSection(); initDeviceSection(); initDigestSection(); initExpiryDatesSection(); } private void initAccountSection() { AwesomeBlogsApp.get().authenticator() .isSignIn() .filter(isSignIn -> isSignIn) .flatMap($ -> AwesomeBlogsApp.get().authenticator().user()) .subscribe(optional -> { optional.ifPresent(user -> { nameView.setText(user.getName()); emailView.setText(user.getEmail()); uidView.setText(user.getId()); }); }); } private void initFcmSection() { bind(Preferences.fcmToken().asObservable() .filter(token -> !TextUtils.isEmpty(token)), fcmTokenView::setText); bind(Preferences.accessToken().asObservable() .filter(token -> !TextUtils.isEmpty(token)), accessTokenView::setText); bind(Preferences.deviceId().asObservable() .filter(token -> !TextUtils.isEmpty(token)), deviceIdView::setText); } private void initAppSection() { gitShaView.setText(BuildConfig.GIT_SHA); buildDateView.setText(new SimpleDateFormat("yy.MM.dd HH:mm", Locale.getDefault()) .format(new Date(TimeUnit.SECONDS.toMillis(BuildConfig.GIT_TIMESTAMP)))); buildTypeView.setText(BuildConfig.BUILD_TYPE); buildFlavorView.setText(BuildConfig.FLAVOR); versionView.setText(BuildConfig.VERSION_NAME + "(" + BuildConfig.VERSION_CODE + ")"); } private void initDeviceSection() { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); String densityBucket = getDensityString(displayMetrics); makeView.setText(Build.MANUFACTURER); modelView.setText(Build.MODEL); resolutionView.setText(displayMetrics.heightPixels + "x" + displayMetrics.widthPixels); densityView.setText(displayMetrics.densityDpi + "dpi (" + densityBucket + ")"); releaseView.setText(Build.VERSION.RELEASE); apiView.setText(String.valueOf(Build.VERSION.SDK_INT)); } private void initDigestSection() { Preference<Long> morningDigestPreference = Preferences.morningDigestAt(); Preference<Long> eveningDigestPreference = Preferences.eveningDigestAt(); bind(morningDigestPreference.asObservable(), digestAt -> morningView.setText(new SimpleDateFormat("dd日 HH:mm:ss", Locale.getDefault()).format(new Date(digestAt)))); bind(eveningDigestPreference.asObservable(), digestAt -> eveningView.setText(new SimpleDateFormat("dd日 HH:mm:ss", Locale.getDefault()).format(new Date(digestAt)))); morningView.setOnClickListener($ -> { long digestAt = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10); morningDigestPreference.set(digestAt); Schedulers.set(context, digestAt, Schedulers.MORNING); }); eveningView.setOnClickListener($ -> { long digestAt = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10); eveningDigestPreference.set(digestAt); Schedulers.set(context, digestAt, Schedulers.EVENING); }); } private void initExpiryDatesSection() { bind(getExpiryDate("all"), allView::setText); bind(getExpiryDate("dev"), developerView::setText); bind(getExpiryDate("company"), companyView::setText); bind(getExpiryDate("insightful"), insightfulView::setText); allView.setOnClickListener($ -> AwesomeBlogsApp.get().api().clearExpiryDate("all")); developerView.setOnClickListener($ -> AwesomeBlogsApp.get().api().clearExpiryDate("dev")); companyView.setOnClickListener($ -> AwesomeBlogsApp.get().api().clearExpiryDate("company")); insightfulView.setOnClickListener($ -> AwesomeBlogsApp.get().api().clearExpiryDate("insightful")); } @OnClick(R.id.uid) void onUidClick() { AwesomeBlogsApp.get().authenticator().signOut(); } private Observable<String> getExpiryDate(@NonNull String category) { return Observable.combineLatest(drawerOpenedSubject, AwesomeBlogsApp.get().api().getExpiryDate(category), ($, date) -> date.getTime() > System.currentTimeMillis() ? new SimpleDateFormat("dd日 HH:mm:ss", Locale.getDefault()).format(date) : "Expired"); } private static String getDensityString(@NonNull DisplayMetrics displayMetrics) { switch (displayMetrics.densityDpi) { case DisplayMetrics.DENSITY_LOW: return "ldpi"; case DisplayMetrics.DENSITY_MEDIUM: return "mdpi"; case DisplayMetrics.DENSITY_HIGH: return "hdpi"; case DisplayMetrics.DENSITY_XHIGH: return "xhdpi"; case DisplayMetrics.DENSITY_XXHIGH: return "xxhdpi"; case DisplayMetrics.DENSITY_XXXHIGH: return "xxxhdpi"; case DisplayMetrics.DENSITY_TV: return "tvdpi"; default: return String.valueOf(displayMetrics.densityDpi); } } }