diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/BaseControlCenterPagerAdapter.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/BaseControlCenterPagerAdapter.java index 84e35268e..579d6bf87 100644 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/BaseControlCenterPagerAdapter.java +++ b/app/src/lumen/java/com/cliqz/browser/controlcenter/BaseControlCenterPagerAdapter.java @@ -1,7 +1,5 @@ package com.cliqz.browser.controlcenter; -import android.content.Context; - import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; @@ -16,14 +14,13 @@ */ public abstract class BaseControlCenterPagerAdapter extends FragmentPagerAdapter { - private Context mContext; - final List mFragmentList = new ArrayList<>(); + final List mFragmentList = new ArrayList<>(); - BaseControlCenterPagerAdapter(FragmentManager fm, Context context) { + BaseControlCenterPagerAdapter(FragmentManager fm) { super(fm); - mContext = context; } + @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @@ -33,11 +30,7 @@ public int getCount() { } public CharSequence getPageTitle(int position) { - return mFragmentList.get(position).getTitle(mContext, position); - } - - void updateCurrentView(int position) { - mFragmentList.get(position).refreshUI(); + return mFragmentList.get(position).getTitle(); } void updateViewComponent(int position, boolean optionValue) { diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterDialog.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterDialog.java index 11e2761f4..9dc9630f8 100644 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterDialog.java +++ b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterDialog.java @@ -1,6 +1,7 @@ package com.cliqz.browser.controlcenter; import android.app.Activity; +import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.util.Log; @@ -14,6 +15,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.SwitchCompat; +import androidx.core.content.ContextCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; @@ -67,9 +69,6 @@ public class ControlCenterDialog extends DialogFragment { @BindView(R.id.subscribe_ultimate_protection_btn) Button subscribeUltimateProtectionBtn; - @BindView(R.id.dashboard_disable_overlay) - View dashboardDisableOverlay; - @Inject AntiTracking antiTracking; @@ -136,11 +135,12 @@ public void onSaveInstanceState(@NonNull Bundle outState) { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - final View view = LayoutInflater.from(getContext()).inflate(R.layout.control_center_layout, + final Context context = getContext(); + final View view = LayoutInflater.from(context).inflate(R.layout.control_center_layout, container, false); ButterKnife.bind(this, view); - mControlCenterPagerAdapter = new ControlCenterPagerAdapter(getChildFragmentManager(), getContext()); + mControlCenterPagerAdapter = new ControlCenterPagerAdapter(getChildFragmentManager()); mControlCenterPagerAdapter.init(); controlCenterPager.setAdapter(mControlCenterPagerAdapter); controlCenterTabLayout.setupWithViewPager(controlCenterPager); @@ -150,9 +150,10 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c ultimateProtectionSwitch.setOnCheckedChangeListener((compoundButton, isChecked) -> { mControlCenterPagerAdapter.updateViewComponent(0, isChecked); mControlCenterPagerAdapter.updateViewComponent(1, isChecked); + toggleTabLayout(isChecked); try { adblocker.setEnabled(isChecked); - antiTracking.setEnabled(isChecked);; + antiTracking.setEnabled(isChecked); preferenceManager.setAttrackEnabled(isChecked); preferenceManager.setAdBlockEnabled(isChecked); bus.post(new Messages.onDashboardStateChange()); @@ -174,7 +175,7 @@ void clearDashboardData(Messages.ClearDashboardData clearDashboardData) { @Subscribe void onPurchaseCompleted(Messages.PurchaseCompleted purchaseCompleted) { - hideSubscribeButton(purchasesManager.getPurchase().isDashboardEnabled()); + hideSubscribeButton(purchasesManager.isDashboardEnabled()); } @Override @@ -188,10 +189,11 @@ public void onConfigurationChanged(Configuration newConfig) { } private void hideSubscribeButton(boolean isDashboardEnabled) { + toggleTabLayout(isDashboardEnabled); ultimateProtectionSwitch.setChecked(preferenceManager.isAttrackEnabled() && preferenceManager.getAdBlockEnabled()); subscribeUltimateProtectionView.setVisibility(isDashboardEnabled ? View.GONE : View.VISIBLE); - dashboardDisableOverlay.setVisibility(isDashboardEnabled ? View.GONE : View.VISIBLE); + ultimateProtectionContainer.setVisibility(isDashboardEnabled ? View.VISIBLE : View.GONE); ViewExtensionsKt.enableViewHierarchy(ultimateProtectionContainer, isDashboardEnabled); ViewExtensionsKt.enableViewHierarchy(controlCenterTabLayout, isDashboardEnabled); controlCenterPager.isPagingEnabled = isDashboardEnabled; @@ -202,9 +204,25 @@ private void hideSubscribeButton(boolean isDashboardEnabled) { } } + private void toggleTabLayout(boolean isEnabled) { + final Context context = getContext(); + if (isEnabled) { + controlCenterTabLayout.setSelectedTabIndicatorColor( + ContextCompat.getColor(context,R.color.bond_general_color_blue)); + controlCenterTabLayout.setTabTextColors( + ContextCompat.getColor(context, R.color.bond_disabled_text_color), + ContextCompat.getColor(context, R.color.bond_general_color_blue)); + } else { + controlCenterTabLayout.setSelectedTabIndicatorColor( + ContextCompat.getColor(context,R.color.lumen_color_grey_text)); + controlCenterTabLayout.setTabTextColors( + ContextCompat.getColor(context, R.color.lumen_color_grey_text), + ContextCompat.getColor(context, R.color.lumen_color_grey_text)); + } + } private void updateUI() { - for (ControlCenterFragment fragment : mControlCenterPagerAdapter.mFragmentList) { + for (DashboardFragment fragment : mControlCenterPagerAdapter.mFragmentList) { fragment.updateUI(); } } diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterFragment.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterFragment.java deleted file mode 100644 index 8fda22f22..000000000 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterFragment.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.cliqz.browser.controlcenter; - -import android.content.Context; - -import androidx.fragment.app.Fragment; - -/** - * Copyright © Cliqz 2019 - */ -public abstract class ControlCenterFragment extends Fragment { - - public abstract String getTitle(Context context, int position); - - public abstract void updateUI(); - - public abstract void refreshUI(); - - public abstract void refreshUIComponent(boolean optionValue); -} diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterPagerAdapter.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterPagerAdapter.java index 7eed075e7..148ee09b2 100644 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterPagerAdapter.java +++ b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterPagerAdapter.java @@ -1,6 +1,5 @@ package com.cliqz.browser.controlcenter; -import android.content.Context; import android.os.Bundle; import androidx.fragment.app.FragmentManager; @@ -12,8 +11,8 @@ public class ControlCenterPagerAdapter extends BaseControlCenterPagerAdapter { static final String IS_TODAY = "is_daily"; - ControlCenterPagerAdapter(FragmentManager fm, Context context) { - super(fm, context); + ControlCenterPagerAdapter(FragmentManager fm) { + super(fm); } public void init() { diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterTabs.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterTabs.java deleted file mode 100644 index 8368ed6fc..000000000 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterTabs.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.cliqz.browser.controlcenter; - -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; - -/** - * @author Stefano Pacifici - */ -enum ControlCenterTabs { - - ; - - @StringRes - final int title; - - final Class fragmentClass; - - ControlCenterTabs(@StringRes int title, @NonNull Class clazz) { - this.title = title; - this.fragmentClass = clazz; - } -} diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterViewPager.kt b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterViewPager.kt index f632d6084..db171b708 100644 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterViewPager.kt +++ b/app/src/lumen/java/com/cliqz/browser/controlcenter/ControlCenterViewPager.kt @@ -16,24 +16,6 @@ class ControlCenterViewPager @JvmOverloads constructor( @JvmField internal var isPagingEnabled = true - init { - addOnPageChangeListener(object : OnPageChangeListener { - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - // Do nothing - } - - override fun onPageSelected(position: Int) { - if (adapter != null) { - (adapter as ControlCenterPagerAdapter).updateCurrentView(position) - } - } - - override fun onPageScrollStateChanged(state: Int) { - // Do nothing - } - }) - } - @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { return this.isPagingEnabled && super.onTouchEvent(event) diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardAdapter.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardAdapter.java deleted file mode 100644 index c8f10520d..000000000 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardAdapter.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.cliqz.browser.controlcenter; - -import android.app.AlertDialog; -import android.content.Context; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.style.TypefaceSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.cliqz.browser.R; -import com.cliqz.browser.main.Messages; -import com.cliqz.nove.Bus; - -import java.util.ArrayList; -import java.util.List; - -/** - * Copyright © Cliqz 2019 - */ -public class DashboardAdapter extends RecyclerView.Adapter { - - private static final int FOOTER_VIEW = 1; - private static final int REGULAR_VIEW = 2; - - private final Context mContext; - private final List mDashboardItems; - private final Bus mBus; - - private boolean mIsDashboardEnabled = true; - - DashboardAdapter(Context context, Bus bus) { - mContext = context; - mDashboardItems = new ArrayList<>(); - mBus = bus; - } - - @NonNull - @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - if (viewType == REGULAR_VIEW) { - final View view = LayoutInflater.from(mContext).inflate(R.layout.dashboard_item2, - parent, false); - return new TwoItemsViewHolder(view); - } else { - final View view = LayoutInflater.from(mContext).inflate(R.layout.bond_dashboard_footer_view, - parent, false); - return new FooterViewHolder(view); - } - } - - private void setTwoItemsRowValues(ItemStructure view, DashboardItemEntity item) { - String measurementText = item.getMeasurementValue(); - final int unitStartIdx = measurementText.length(); - if (!item.getMeasurementUnit().isEmpty()) { - measurementText = measurementText.concat("\n").concat(item.getMeasurementUnit()); - } - final Spannable spannable = new SpannableString(measurementText); - spannable.setSpan(new TypefaceSpan(mContext.getString(R.string.roboto_light)), unitStartIdx, measurementText.length() - , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - view.itemMeasurementView.setText(spannable); - if (item.getmViewType() == DashboardItemEntity.VIEW_TYPE_SHIELD) { - view.itemMeasurementView.setBackgroundResource(item.getIconResId()); - } else { - view.itemMeasurementView.setCompoundDrawablesWithIntrinsicBounds(0, item.getIconResId(), 0, 0); - } - view.itemTitleView.setText(item.getTitle()); - } - - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - if (holder instanceof TwoItemsViewHolder) { - final TwoItemsViewHolder viewHolder = (TwoItemsViewHolder) holder; - setTwoItemsRowValues(viewHolder.leftItem, mDashboardItems.get(position * 2)); - setTwoItemsRowValues(viewHolder.rightItem, mDashboardItems.get(position * 2 + 1)); - viewHolder.leftItem.changeState(mIsDashboardEnabled); - viewHolder.rightItem.changeState(mIsDashboardEnabled); - } else { - final FooterViewHolder viewHolder = (FooterViewHolder) holder; - if (mIsDashboardEnabled) { - viewHolder.resetButton.setOnClickListener(v -> new AlertDialog.Builder(v.getContext()) - .setTitle(R.string.bond_dashboard_clear_dialog_title) - .setMessage(R.string.bond_dashboard_clear_dialog_message) - .setPositiveButton(R.string.button_ok, (dialogInterface, i) -> { - mBus.post(new Messages.ClearDashboardData()); - }) - .setNegativeButton(R.string.cancel, null) - .show()); - } - } - } - - @Override - public int getItemCount() { - //The data is shown in groups of 2 and we have a footer item in the end. - return mDashboardItems.size() / 2 + 1; - } - - @Override - public int getItemViewType(int position) { - if (position == mDashboardItems.size() / 2) { - return FOOTER_VIEW; - } else { - return REGULAR_VIEW; - } - } - - void addItems(List items) { - mDashboardItems.clear(); - mDashboardItems.addAll(items); - notifyDataSetChanged(); - } - - void setIsDashboardEnabled(boolean isDashboardEnabled) { - mIsDashboardEnabled = isDashboardEnabled; - notifyDataSetChanged(); - } - - private enum ItemType { - ONE_VIEW, TWO_VIEWS - } - - private class ItemStructure { - RelativeLayout itemLayout; - TextView itemMeasurementView; - TextView itemTitleView; - - void changeState(boolean isEnabled) { - itemMeasurementView.setEnabled(isEnabled); - itemTitleView.setEnabled(isEnabled); - } - } - - private class TwoItemsViewHolder extends RecyclerView.ViewHolder { - final ItemStructure leftItem; - final ItemStructure rightItem; - - TwoItemsViewHolder(View itemView) { - super(itemView); - final RelativeLayout leftView = itemView.findViewById(R.id.left_item); - leftItem = findViews(leftView); - leftItem.itemLayout = leftView; - - leftItem.changeState(mIsDashboardEnabled); - final RelativeLayout rightView = itemView.findViewById(R.id.right_item); - rightItem = findViews(rightView); - rightItem.itemLayout = rightView; - rightItem.changeState(mIsDashboardEnabled); - } - - private ItemStructure findViews(View view) { - final ItemStructure item = new ItemStructure(); - item.itemTitleView = view.findViewById(R.id.item_title); - item.itemMeasurementView = view.findViewById(R.id.item_measurement); - return item; - } - } - - private class FooterViewHolder extends RecyclerView.ViewHolder { - final TextView resetButton; - - FooterViewHolder(View view) { - super(view); - resetButton = view.findViewById(R.id.reset); - } - } -} \ No newline at end of file diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardFragment.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardFragment.java deleted file mode 100644 index 561ed4bd4..000000000 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardFragment.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.cliqz.browser.controlcenter; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.cliqz.browser.R; -import com.cliqz.browser.app.BrowserApp; -import com.cliqz.browser.main.FlavoredActivityComponent; -import com.cliqz.browser.main.Messages; -import com.cliqz.browser.purchases.PurchasesManager; -import com.cliqz.jsengine.Insights; -import com.cliqz.jsengine.ReadableMapUtils; -import com.cliqz.nove.Bus; -import com.cliqz.nove.Subscribe; -import com.facebook.react.bridge.ReadableMap; - -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import acr.browser.lightning.preference.PreferenceManager; - -import static com.cliqz.browser.controlcenter.DashboardItemEntity.VIEW_TYPE_ICON; -import static com.cliqz.browser.controlcenter.DashboardItemEntity.VIEW_TYPE_SHIELD; - -/** - * Copyright © Cliqz 2019 - */ -public class DashboardFragment extends ControlCenterFragment { - - private DashboardAdapter mDashboardAdapter; - private boolean mIsDailyView; - private final int[] tabsTitleIds = { - R.string.bond_dashboard_today_title, R.string.bond_dashboard_week_title}; - - @Inject - Bus bus; - - @Inject - Insights insights; - - @Inject - PurchasesManager purchasesManager; - - @Inject - PreferenceManager preferenceManager; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - final Bundle arguments = getArguments(); - if (arguments != null) { - mIsDailyView = arguments.getBoolean(ControlCenterPagerAdapter.IS_TODAY); - } - final FlavoredActivityComponent component = getActivity() != null ? - BrowserApp.getActivityComponent(getActivity()) : null; - if (component != null) { - component.inject(this); - } - bus.register(this); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - final View view = inflater.inflate(R.layout.bond_dashboard_fragment, container, - false); - final RecyclerView dashBoardListView = view.findViewById(R.id.dashboard_list_view); - mDashboardAdapter = new DashboardAdapter(getContext(), bus); - updateUI(); - dashBoardListView.setAdapter(mDashboardAdapter); - dashBoardListView.setLayoutManager(new LinearLayoutManager(getContext())); - changeDashboardState(purchasesManager.isDashboardEnabled() && - preferenceManager.isAttrackEnabled() && preferenceManager.getAdBlockEnabled()); - return view; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - updateUI(); - } - - public void changeDashboardState(boolean isEnabled) { - mDashboardAdapter.setIsDashboardEnabled(isEnabled); - } - - @Override - public String getTitle(Context context, int pos) { - return context.getString(tabsTitleIds[pos]); - } - - @Override - public void updateUI() { - if (mDashboardAdapter == null || getView() == null) { - return; - } - if (mIsDailyView) { - insights.getInsightsData((data) -> getView().post(() -> updateViews(data.getMap("result"))), "day"); - } else { - insights.getInsightsData((data) -> getView().post(() -> updateViews(data.getMap("result"))), "week"); - } - - } - - @Override - public void refreshUI() { - if (getView() == null) { - return; //return if view is not inflated yet - } - mDashboardAdapter.notifyDataSetChanged(); - } - - @Override - public void refreshUIComponent(boolean optionValue) { - changeDashboardState(optionValue); - } - - public void updateViews(ReadableMap data) { - if (data == null) { - return; - } - - final MeasurementWrapper dataSaved; - final MeasurementWrapper adsBlocked; - final MeasurementWrapper trackersDetected; - final MeasurementWrapper pagesVisited; - - if (purchasesManager.isDashboardEnabled() && - preferenceManager.getAdBlockEnabled() && preferenceManager.isAttrackEnabled()) { - dataSaved = ValuesFormatterUtil.formatBytesCount(ReadableMapUtils.getSafeInt(data, "dataSaved")); - adsBlocked = ValuesFormatterUtil.formatBlockCount(ReadableMapUtils.getSafeInt(data,"adsBlocked")); - trackersDetected = ValuesFormatterUtil.formatBlockCount(ReadableMapUtils.getSafeInt(data, "trackersDetected")); - pagesVisited = ValuesFormatterUtil.formatBlockCount(ReadableMapUtils.getSafeInt(data,"pages")); - } else { - dataSaved = ValuesFormatterUtil.formatBytesCount(0); - adsBlocked = ValuesFormatterUtil.formatBlockCount(0); - trackersDetected = ValuesFormatterUtil.formatBlockCount(0); - pagesVisited = ValuesFormatterUtil.formatBlockCount(0); - } - - final List dashboardItems = new ArrayList<>(); - - dashboardItems.add(new DashboardItemEntity(adsBlocked.getValue(), - adsBlocked.getUnit() == 0 ? "" : getString(adsBlocked.getUnit()), - R.drawable.ic_ad_blocking_shiel, getString(R.string.bond_dashboard_ads_blocked_title), -1, VIEW_TYPE_SHIELD)); - dashboardItems.add(new DashboardItemEntity(trackersDetected.getValue(), "", - R.drawable.ic_eye, getString(R.string.bond_dashboard_tracking_companies_title), -1, VIEW_TYPE_ICON)); - dashboardItems.add(new DashboardItemEntity(dataSaved.getValue(), - dataSaved.getUnit() == 0 ? "" : getString(dataSaved.getUnit()), R.drawable.ic_ad_blocking_shiel, - getString(R.string.bond_dashboard_data_saved_title), -1, VIEW_TYPE_SHIELD)); - dashboardItems.add(new DashboardItemEntity(pagesVisited.getValue(), "", R.drawable.ic_anti_phishing_hook, - getString(R.string.bond_dashboard_phishing_protection_title), -1, VIEW_TYPE_ICON)); - mDashboardAdapter.addItems(dashboardItems); - } - - @Subscribe - void onPurchaseCompleted(Messages.PurchaseCompleted purchaseCompleted) { - if (purchasesManager.getPurchase().isDashboardEnabled()) { - bus.post(new Messages.EnableAdBlock()); - bus.post(new Messages.EnableAttrack()); - changeDashboardState(true); - } - } - -} \ No newline at end of file diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardFragment.kt b/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardFragment.kt new file mode 100644 index 000000000..6ece9b241 --- /dev/null +++ b/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardFragment.kt @@ -0,0 +1,183 @@ +package com.cliqz.browser.controlcenter + +import acr.browser.lightning.preference.PreferenceManager +import android.graphics.Color +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.cliqz.browser.R +import com.cliqz.browser.app.BrowserApp +import com.cliqz.browser.extensions.color +import com.cliqz.browser.extensions.setDrawable +import com.cliqz.browser.extensions.tintVectorDrawable +import com.cliqz.browser.main.Messages +import com.cliqz.browser.purchases.PurchasesManager +import com.cliqz.jsengine.Insights +import com.cliqz.jsengine.ReadableMapUtils +import com.cliqz.nove.Bus +import com.cliqz.nove.Subscribe +import com.facebook.react.bridge.ReadableMap +import kotlinx.android.synthetic.lumen.bond_dashboard_fragment.* +import javax.inject.Inject + +class DashboardFragment : Fragment() { + + private var isDailyView = false + + @Inject + internal lateinit var bus: Bus + + @Inject + internal lateinit var insights: Insights + + @Inject + internal lateinit var purchasesManager: PurchasesManager + + @Inject + internal lateinit var preferenceManager: PreferenceManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + isDailyView = arguments?.getBoolean(ControlCenterPagerAdapter.IS_TODAY) ?: true + BrowserApp.getActivityComponent(activity)?.inject(this) + bus.register(this) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.bond_dashboard_fragment, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + changeDashboardState(purchasesManager.isDashboardEnabled() && + preferenceManager.isAttrackEnabled && preferenceManager.adBlockEnabled) + reset.setOnClickListener { + if (!preferenceManager.isAttrackEnabled && !preferenceManager.adBlockEnabled) { + return@setOnClickListener + } + android.app.AlertDialog.Builder(it.context) + .setTitle(R.string.bond_dashboard_clear_dialog_title) + .setMessage(R.string.bond_dashboard_clear_dialog_message) + .setPositiveButton(R.string.button_ok) { _, _ -> + bus.post(Messages.ClearDashboardData()) + } + .setNegativeButton(R.string.cancel, null) + .show() + } + updateUI() + } + + fun getTitle(): String { + return if (isDailyView) { + context!!.getString(R.string.bond_dashboard_today_title) + } else { + context!!.getString(R.string.bond_dashboard_week_title) + } + } + + fun updateUI() { + val periodType = if (isDailyView) "day" else "week" + insights.getInsightsData({ + view?.post { + updateViews(it.getMap("result")) + } + }, periodType) + } + + fun refreshUIComponent(optionValue: Boolean) { + changeDashboardState(optionValue) + } + + private fun updateViews(data: ReadableMap?) { + if (data == null) return + + val dataSaved: MeasurementWrapper + val adsBlocked: MeasurementWrapper + val trackersDetected: MeasurementWrapper + val pagesVisited: MeasurementWrapper + + if (purchasesManager.isDashboardEnabled() && + preferenceManager.adBlockEnabled && preferenceManager.isAttrackEnabled) { + dataSaved = ValuesFormatterUtil.formatBytesCount(ReadableMapUtils.getSafeInt(data, "dataSaved")) + adsBlocked = ValuesFormatterUtil.formatBlockCount(ReadableMapUtils.getSafeInt(data, "adsBlocked")) + trackersDetected = ValuesFormatterUtil.formatBlockCount(ReadableMapUtils.getSafeInt(data, "trackersDetected")) + pagesVisited = ValuesFormatterUtil.formatBlockCount(ReadableMapUtils.getSafeInt(data, "pages")) + } else { + dataSaved = ValuesFormatterUtil.formatBytesCount(0) + adsBlocked = ValuesFormatterUtil.formatBlockCount(0) + trackersDetected = ValuesFormatterUtil.formatBlockCount(0) + pagesVisited = ValuesFormatterUtil.formatBlockCount(0) + } + + ads_blocked.text = adsBlocked.value + trackers_detected.text = trackersDetected.value + data_saved.text = dataSaved.value + phishing_checked.text = pagesVisited.value + + data_saved_icon.setDrawable(when (dataSaved.unit) { + R.string.bond_dashboard_units_kb -> R.drawable.ic_kb_data_saved_on + R.string.bond_dashboard_units_mb -> R.drawable.ic_mb_data_saved_on + R.string.bond_dashboard_units_gb -> R.drawable.ic_gb_data_saved_on + else -> throw IllegalArgumentException("Wrong unit for 'data saved' data") + }) + } + + private fun changeDashboardState(isEnabled: Boolean) { + if (isEnabled) { + ads_blocked_icon.clearColorFilter() + trackers_detected_icon.clearColorFilter() + data_saved_icon.clearColorFilter() + phishing_checked_icon.clearColorFilter() + context?.apply { + ads_blocked.setTextColor(Color.WHITE) + trackers_detected.setTextColor(Color.WHITE) + data_saved.setTextColor(Color.WHITE) + phishing_checked.setTextColor(Color.WHITE) + + ads_blocked_text.setTextColor(Color.WHITE) + trackers_detected_text.setTextColor(Color.WHITE) + data_saved_text.setTextColor(Color.WHITE) + phishing_checked_text.setTextColor(Color.WHITE) + + reset.setTextColor(color(R.color.lumen_color_blue_primary)) + + vertical_line.setBackgroundColor(color(R.color.lumen_color_blue_primary_opaque)) + horizontal_line.setBackgroundColor(color(R.color.lumen_color_blue_primary_opaque)) + } + } else { + ads_blocked_icon.tintVectorDrawable(R.color.lumen_color_grey_text) + trackers_detected_icon.tintVectorDrawable(R.color.lumen_color_grey_text) + data_saved_icon.tintVectorDrawable(R.color.lumen_color_grey_text) + phishing_checked_icon.tintVectorDrawable(R.color.lumen_color_grey_text) + context?.apply { + ads_blocked.setTextColor(color(R.color.lumen_color_grey_text)) + trackers_detected.setTextColor(color(R.color.lumen_color_grey_text)) + data_saved.setTextColor(color(R.color.lumen_color_grey_text)) + phishing_checked.setTextColor(color(R.color.lumen_color_grey_text)) + + ads_blocked_text.setTextColor(color(R.color.lumen_color_grey_text)) + trackers_detected_text.setTextColor(color(R.color.lumen_color_grey_text)) + data_saved_text.setTextColor(color(R.color.lumen_color_grey_text)) + phishing_checked_text.setTextColor(color(R.color.lumen_color_grey_text)) + + reset.setTextColor(color(R.color.lumen_color_grey_text)) + + vertical_line.setBackgroundColor(color(R.color.lumen_color_grey_text)) + horizontal_line.setBackgroundColor(color(R.color.lumen_color_grey_text)) + } + } + } + + @Subscribe + internal fun onPurchaseCompleted(purchaseCompleted: Messages.PurchaseCompleted) { + if (purchasesManager.purchase.isDashboardEnabled) { + bus.post(Messages.EnableAdBlock()) + bus.post(Messages.EnableAttrack()) + changeDashboardState(true) + } + } + +} \ No newline at end of file diff --git a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardItemEntity.java b/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardItemEntity.java deleted file mode 100644 index 2a938cbf1..000000000 --- a/app/src/lumen/java/com/cliqz/browser/controlcenter/DashboardItemEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.cliqz.browser.controlcenter; - -/** - * Copyright © Cliqz 2019 - */ -public class DashboardItemEntity { - - static final int VIEW_TYPE_SHIELD = 1; - static final int VIEW_TYPE_ICON = 2; - - private String mMeasurementValue; - private String mMeasurementUnit; - private int mIconResId; - private String mTitle; - private int mOptionValue; - private int mViewType; - - DashboardItemEntity(String measurementValue, String measurementUnit, int iconResId, String title, int optionValue, int viewType) { - this.mMeasurementValue = measurementValue; - this.mMeasurementUnit = measurementUnit; - this.mIconResId = iconResId; - this.mTitle = title; - this.mOptionValue = optionValue; - this.mViewType = viewType; - } - - String getMeasurementValue() { - return mMeasurementValue; - } - - String getMeasurementUnit() { - return mMeasurementUnit; - } - - int getIconResId() { - return mIconResId; - } - - public void setIconResId(int iconResId) { - this.mIconResId = iconResId; - } - - public String getTitle() { - return mTitle; - } - - public void setTitle(String title) { - this.mTitle = title; - } - - public int getmViewType() { - return mViewType; - } -} diff --git a/app/src/lumen/java/com/cliqz/browser/extensions/DrawableExtensions.kt b/app/src/lumen/java/com/cliqz/browser/extensions/DrawableExtensions.kt index a377f1d3e..6d64402ee 100644 --- a/app/src/lumen/java/com/cliqz/browser/extensions/DrawableExtensions.kt +++ b/app/src/lumen/java/com/cliqz/browser/extensions/DrawableExtensions.kt @@ -1,10 +1,45 @@ package com.cliqz.browser.extensions +import android.content.Context +import android.graphics.PorterDuff +import android.graphics.drawable.Drawable +import android.widget.ImageView import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat fun TextView.drawableStart(@DrawableRes id: Int) { val drawable = ContextCompat.getDrawable(context, id) setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) } + +fun ImageView.setDrawable(@DrawableRes id: Int) { + setImageDrawable(ContextCompat.getDrawable(context, id)) +} + +@ColorInt fun Context.getColorCompat(@ColorRes id: Int): Int { + return ContextCompat.getColor(this, id) +} + +fun ImageView.tint(@ColorRes id: Int) { + drawable.tint(context, id) +} + +fun Drawable.tint(@ColorInt value: Int): Drawable { + val tintedDrawable = DrawableCompat.wrap(this).mutate() + DrawableCompat.setTint(tintedDrawable, value) + return tintedDrawable +} + +fun Drawable.tint(context: Context, @ColorRes id: Int): Drawable { + return tint(context.getColorCompat(id)) +} + +fun ImageView.tintVectorDrawable(@ColorRes id: Int) { + setColorFilter(ContextCompat.getColor(context, id), PorterDuff.Mode.SRC_IN) +} + +fun Context.color(@ColorRes id: Int) = ContextCompat.getColor(this, id) diff --git a/app/src/lumen/res/drawable/ic_adblock_on.xml b/app/src/lumen/res/drawable/ic_adblock_on.xml new file mode 100644 index 000000000..bb7459422 --- /dev/null +++ b/app/src/lumen/res/drawable/ic_adblock_on.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/app/src/lumen/res/drawable/ic_antiphishing_on.xml b/app/src/lumen/res/drawable/ic_antiphishing_on.xml new file mode 100644 index 000000000..2f76b1ff0 --- /dev/null +++ b/app/src/lumen/res/drawable/ic_antiphishing_on.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/app/src/lumen/res/drawable/ic_antitracking_on.xml b/app/src/lumen/res/drawable/ic_antitracking_on.xml new file mode 100644 index 000000000..1d76baf8d --- /dev/null +++ b/app/src/lumen/res/drawable/ic_antitracking_on.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/app/src/lumen/res/drawable/ic_gb_data_saved_on.xml b/app/src/lumen/res/drawable/ic_gb_data_saved_on.xml new file mode 100644 index 000000000..a6d09255b --- /dev/null +++ b/app/src/lumen/res/drawable/ic_gb_data_saved_on.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/lumen/res/drawable/ic_kb_data_saved_on.xml b/app/src/lumen/res/drawable/ic_kb_data_saved_on.xml new file mode 100644 index 000000000..4f20112f1 --- /dev/null +++ b/app/src/lumen/res/drawable/ic_kb_data_saved_on.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/lumen/res/drawable/ic_mb_data_saved_on.xml b/app/src/lumen/res/drawable/ic_mb_data_saved_on.xml new file mode 100644 index 000000000..0c3a39082 --- /dev/null +++ b/app/src/lumen/res/drawable/ic_mb_data_saved_on.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/lumen/res/drawable/rounded_corner_solid_button.xml b/app/src/lumen/res/drawable/rounded_corner_solid_button.xml index 51f7008ac..f14ade2c5 100644 --- a/app/src/lumen/res/drawable/rounded_corner_solid_button.xml +++ b/app/src/lumen/res/drawable/rounded_corner_solid_button.xml @@ -3,12 +3,12 @@ + android:color="@color/lumen_color_blue_primary" /> + android:color="@color/lumen_color_blue_primary" /> + android:radius="4dp" /> \ No newline at end of file diff --git a/app/src/lumen/res/layout/bond_dashboard_footer_view.xml b/app/src/lumen/res/layout/bond_dashboard_footer_view.xml deleted file mode 100644 index 90683e0a3..000000000 --- a/app/src/lumen/res/layout/bond_dashboard_footer_view.xml +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/app/src/lumen/res/layout/bond_dashboard_fragment.xml b/app/src/lumen/res/layout/bond_dashboard_fragment.xml index 0a2827b71..7b11d38d8 100644 --- a/app/src/lumen/res/layout/bond_dashboard_fragment.xml +++ b/app/src/lumen/res/layout/bond_dashboard_fragment.xml @@ -1,15 +1,212 @@ - - + + android:orientation="vertical" + tools:ignore="ContentDescription"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_centerInParent="true" + android:layout_marginBottom="8dp" + android:background="@color/primary_color" + android:gravity="center" + android:paddingTop="15dp" + android:paddingBottom="15dp" + android:text="@string/reset_statistics" + android:textAllCaps="true" + android:textColor="@color/lumen_color_blue_primary" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/vertical_line" + app:layout_constraintVertical_bias="1" /> - + diff --git a/app/src/lumen/res/layout/control_center_layout.xml b/app/src/lumen/res/layout/control_center_layout.xml index 8bbe10305..0a37240c4 100644 --- a/app/src/lumen/res/layout/control_center_layout.xml +++ b/app/src/lumen/res/layout/control_center_layout.xml @@ -50,12 +50,4 @@ android:layout_below="@+id/control_center_tab_layout" android:background="@android:color/transparent" /> - - diff --git a/app/src/lumen/res/layout/dashboard_item1.xml b/app/src/lumen/res/layout/dashboard_item1.xml deleted file mode 100644 index 0837b3e2d..000000000 --- a/app/src/lumen/res/layout/dashboard_item1.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/lumen/res/layout/dashboard_item2.xml b/app/src/lumen/res/layout/dashboard_item2.xml deleted file mode 100644 index b254b9e1c..000000000 --- a/app/src/lumen/res/layout/dashboard_item2.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/lumen/res/layout/dashboard_item2_structure.xml b/app/src/lumen/res/layout/dashboard_item2_structure.xml deleted file mode 100644 index d9b7383c3..000000000 --- a/app/src/lumen/res/layout/dashboard_item2_structure.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/lumen/res/layout/subscribe_ultimate_protection_view.xml b/app/src/lumen/res/layout/subscribe_ultimate_protection_view.xml index 81bf788a7..dd8076ad5 100644 --- a/app/src/lumen/res/layout/subscribe_ultimate_protection_view.xml +++ b/app/src/lumen/res/layout/subscribe_ultimate_protection_view.xml @@ -4,18 +4,27 @@ android:id="@+id/subscribe_ultimate_protection" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/primary_color" + android:background="@color/lumen_color_background" android:orientation="horizontal"> + + @@ -24,31 +33,32 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="12dp" - android:paddingEnd="8dp" - android:paddingStart="0dp" android:maxLines="3" android:text="@string/non_subscriber_ultimate_protection_desc" android:textColor="@color/white" + android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/subscribe_ultimate_protection_btn" + app:layout_constraintEnd_toEndOf="@+id/vertical_guideline" app:layout_constraintStart_toStartOf="@+id/subscribe_ultimate_protection_title" app:layout_constraintTop_toBottomOf="@+id/subscribe_ultimate_protection_title" />