diff --git a/app/src/main/java/eu/faircode/netguard/ActivityMain.java b/app/src/main/java/eu/faircode/netguard/ActivityMain.java index af7bd1744..30e9826dc 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivityMain.java +++ b/app/src/main/java/eu/faircode/netguard/ActivityMain.java @@ -246,6 +246,8 @@ protected void onCreate(Bundle savedInstanceState) { ivQueue = actionView.findViewById(R.id.ivQueue); swEnabled = actionView.findViewById(R.id.swEnabled); ivMetered = actionView.findViewById(R.id.ivMetered); + ivQueue.setContentDescription(getString(R.string.msg_queue)); + ivMetered.setContentDescription(getString(R.string.msg_metered)); // Get daily changing title if (!Util.isPlayStoreInstall()) diff --git a/app/src/main/java/eu/faircode/netguard/AdapterAccess.java b/app/src/main/java/eu/faircode/netguard/AdapterAccess.java index eb10e16c6..f89ce90d2 100644 --- a/app/src/main/java/eu/faircode/netguard/AdapterAccess.java +++ b/app/src/main/java/eu/faircode/netguard/AdapterAccess.java @@ -121,10 +121,12 @@ public void bindView(final View view, final Context context, final Cursor cursor // Set values tvTime.setText(new SimpleDateFormat("dd HH:mm").format(time)); - if (block < 0) + if (block < 0) { ivBlock.setImageDrawable(null); - else { + ivBlock.setContentDescription(null); + } else { ivBlock.setImageResource(block > 0 ? R.drawable.host_blocked : R.drawable.host_allowed); + ivBlock.setContentDescription(context.getString(block > 0 ? R.string.blocked : R.string.allowed)); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Drawable wrap = DrawableCompat.wrap(ivBlock.getDrawable()); DrawableCompat.setTint(wrap, block > 0 ? colorOff : colorOn); diff --git a/app/src/main/java/eu/faircode/netguard/WidgetMain.java b/app/src/main/java/eu/faircode/netguard/WidgetMain.java index 3b7c84e71..8c3c22f0a 100644 --- a/app/src/main/java/eu/faircode/netguard/WidgetMain.java +++ b/app/src/main/java/eu/faircode/netguard/WidgetMain.java @@ -55,6 +55,9 @@ private static void update(int[] appWidgetIds, AppWidgetManager appWidgetManager RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widgetmain); views.setOnClickPendingIntent(R.id.ivEnabled, pi); views.setImageViewResource(R.id.ivEnabled, enabled ? R.drawable.ic_rocket_colour : R.drawable.ic_rocket_white_60); + views.setContentDescription(R.id.ivEnabled, context.getString( + enabled ? R.string.widget_toggle_disable_description + : R.string.widget_toggle_enable_description)); appWidgetManager.updateAppWidget(id, views); } } catch (Throwable ex) { diff --git a/app/src/main/java/net/kollnig/missioncontrol/InsightsHeaderAdapter.java b/app/src/main/java/net/kollnig/missioncontrol/InsightsHeaderAdapter.java index b11931f1b..69b34e8f3 100644 --- a/app/src/main/java/net/kollnig/missioncontrol/InsightsHeaderAdapter.java +++ b/app/src/main/java/net/kollnig/missioncontrol/InsightsHeaderAdapter.java @@ -108,12 +108,27 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) { } NumberFormat nf = NumberFormat.getNumberInstance(Locale.getDefault()); - holder.tvBlocked.setText(nf.format(data.getTotalTrackingAttempts())); - holder.tvCompanies.setText(String.valueOf(data.getUniqueTrackerCompanies())); + String blockedText = nf.format(data.getTotalTrackingAttempts()); + String companiesText = String.valueOf(data.getUniqueTrackerCompanies()); + holder.tvBlocked.setText(blockedText); + holder.tvCompanies.setText(companiesText); // Protection percentage + bar (weights divide the bar into blocked/allowed) int pct = data.getBlockedPercentage(); - holder.tvBlockedPct.setText(pct + "%"); + String pctText = pct + "%"; + holder.tvBlockedPct.setText(pctText); + + // Group each stat number + label so TalkBack announces them as a + // single unit instead of two separate reads. + holder.llBlockedStat.setContentDescription( + context.getString(R.string.accessibility_stat_description, blockedText, + context.getString(R.string.insights_tracking_attempts))); + holder.llCompaniesStat.setContentDescription( + context.getString(R.string.accessibility_stat_description, companiesText, + context.getString(R.string.insights_tracker_companies))); + holder.llBlockedPctStat.setContentDescription( + context.getString(R.string.accessibility_stat_description, pctText, + context.getString(R.string.insights_blocked))); LinearLayout.LayoutParams blockedLp = (LinearLayout.LayoutParams) holder.vBlockedProgress.getLayoutParams(); blockedLp.weight = pct; @@ -280,6 +295,9 @@ static class ViewHolder extends RecyclerView.ViewHolder { TextView tvBlockedPct; View vBlockedProgress; View vAllowedProgress; + View llBlockedStat; + View llCompaniesStat; + View llBlockedPctStat; ViewHolder(View itemView) { super(itemView); @@ -292,6 +310,9 @@ static class ViewHolder extends RecyclerView.ViewHolder { tvBlockedPct = itemView.findViewById(R.id.tvHeroBlockedPct); vBlockedProgress = itemView.findViewById(R.id.vBlockedProgress); vAllowedProgress = itemView.findViewById(R.id.vAllowedProgress); + llBlockedStat = itemView.findViewById(R.id.llHeroBlockedStat); + llCompaniesStat = itemView.findViewById(R.id.llHeroCompaniesStat); + llBlockedPctStat = itemView.findViewById(R.id.llHeroBlockedPctStat); } } } diff --git a/app/src/main/res/layout/activity_insights.xml b/app/src/main/res/layout/activity_insights.xml index 95782d28c..25da0504d 100644 --- a/app/src/main/res/layout/activity_insights.xml +++ b/app/src/main/res/layout/activity_insights.xml @@ -399,6 +399,7 @@ diff --git a/app/src/main/res/layout/item_insights_header.xml b/app/src/main/res/layout/item_insights_header.xml index 49be3e2f5..b1752a14f 100644 --- a/app/src/main/res/layout/item_insights_header.xml +++ b/app/src/main/res/layout/item_insights_header.xml @@ -52,7 +52,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:alpha="0.9" + android:alpha="0.95" android:text="@string/insights_subtitle_7days" android:textColor="@android:color/white" android:textSize="13sp" @@ -92,15 +92,18 @@ @@ -108,7 +111,8 @@ @@ -117,15 +121,18 @@ @@ -133,7 +140,8 @@ @@ -142,8 +150,10 @@ @@ -152,7 +162,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:textColor="#A5D6A7" + android:importantForAccessibility="no" + android:textColor="#F1F8E9" android:textSize="36sp" android:textStyle="bold" /> @@ -160,7 +171,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:alpha="0.85" + android:alpha="0.95" + android:importantForAccessibility="no" android:text="@string/insights_blocked" android:textColor="@android:color/white" android:textSize="11sp" /> diff --git a/app/src/main/res/layout/item_onboarding.xml b/app/src/main/res/layout/item_onboarding.xml index ccc800576..0febe431e 100644 --- a/app/src/main/res/layout/item_onboarding.xml +++ b/app/src/main/res/layout/item_onboarding.xml @@ -18,6 +18,7 @@ android:layout_height="120dp" android:layout_marginBottom="24dp" android:layout_gravity="start" + android:importantForAccessibility="no" android:src="@drawable/ic_rocket2" app:tint="?attr/colorAccent" /> diff --git a/app/src/main/res/layout/item_onboarding_blocking_mode.xml b/app/src/main/res/layout/item_onboarding_blocking_mode.xml index daf202f1c..7e990b395 100644 --- a/app/src/main/res/layout/item_onboarding_blocking_mode.xml +++ b/app/src/main/res/layout/item_onboarding_blocking_mode.xml @@ -18,6 +18,7 @@ android:layout_height="80dp" android:layout_marginBottom="16dp" android:layout_gravity="start" + android:importantForAccessibility="no" android:src="@drawable/ic_rocket2" app:tint="?attr/colorAccent" /> diff --git a/app/src/main/res/layout/legend.xml b/app/src/main/res/layout/legend.xml index d309a87dc..85929c8de 100644 --- a/app/src/main/res/layout/legend.xml +++ b/app/src/main/res/layout/legend.xml @@ -18,7 +18,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:src="@drawable/ic_rocket_colour"/> + android:src="@drawable/ic_rocket_colour" + android:importantForAccessibility="no"/> + android:src="@drawable/ic_rocket_white_60" + android:importantForAccessibility="no"/> + android:src="?attr/iconQueue" + android:importantForAccessibility="no"/> + android:src="?attr/iconMetered" + android:importantForAccessibility="no"/> + android:src="@drawable/wifi_on" + android:importantForAccessibility="no"/> + android:src="@drawable/wifi_off" + android:importantForAccessibility="no"/> + android:src="@drawable/wifi_off_disabled" + android:importantForAccessibility="no"/> + android:src="@drawable/other_on" + android:importantForAccessibility="no"/> + android:src="@drawable/other_off" + android:importantForAccessibility="no"/> + android:src="@drawable/other_off_disabled" + android:importantForAccessibility="no"/> + android:src="@drawable/screen_on" + android:importantForAccessibility="no"/> + android:src="@drawable/host_allowed" + android:importantForAccessibility="no"/> + android:src="@drawable/host_blocked" + android:importantForAccessibility="no"/> Internet access control unavailable for %1$s Tracker blocking for category %1$s + + Enable tracker blocking + Disable tracker blocking + %1$s, %2$s contacted %d company last week contacted %d companies last week