Skip to content

Commit fa2fb0f

Browse files
committed
usage: improve accessibility and localization
- Bar chart is now accessible for screen reading apps and from keyboards - Made the usage header accessible to screen readers - Add localization support for bar chart. Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
1 parent 9976b7e commit fa2fb0f

8 files changed

Lines changed: 519 additions & 21 deletions

File tree

app/src/main/java/io/github/muntashirakon/AppManager/usage/AppUsageActivity.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.github.muntashirakon.AppManager.utils.BetterActivityResult;
3030
import io.github.muntashirakon.AppManager.utils.UIUtils;
3131
import io.github.muntashirakon.adapters.SelectedArrayAdapter;
32+
import io.github.muntashirakon.util.AccessibilityUtils;
3233
import io.github.muntashirakon.util.UiUtils;
3334
import io.github.muntashirakon.view.ProgressIndicatorCompat;
3435
import io.github.muntashirakon.widget.MaterialSpinner;
@@ -43,6 +44,8 @@ public class AppUsageActivity extends BaseActivity implements SwipeRefreshLayout
4344
R.id.action_sort_by_wifi_data};
4445

4546
AppUsageViewModel viewModel;
47+
MaterialSpinner spinner;
48+
RecyclerView recyclerView;
4649
LinearProgressIndicator progressIndicator;
4750
private SwipeRefreshLayout mSwipeRefresh;
4851
private AppUsageAdapter mAppUsageAdapter;
@@ -68,7 +71,7 @@ protected void onAuthenticated(Bundle savedInstanceState) {
6871
progressIndicator.setVisibilityAfterHide(View.GONE);
6972

7073
// Interval
71-
MaterialSpinner spinner = findViewById(R.id.spinner);
74+
spinner = findViewById(R.id.spinner);
7275
UiUtils.applyWindowInsetsAsMargin(spinner, false, false);
7376
spinner.requestFocus();
7477
ArrayAdapter<CharSequence> intervalSpinnerAdapter = SelectedArrayAdapter.createFromResource(this,
@@ -82,7 +85,7 @@ protected void onAuthenticated(Bundle savedInstanceState) {
8285

8386
// Get usage stats
8487
mAppUsageAdapter = new AppUsageAdapter(this);
85-
RecyclerView recyclerView = findViewById(R.id.scrollView);
88+
recyclerView = findViewById(R.id.scrollView);
8689
recyclerView.setEmptyView(findViewById(android.R.id.empty));
8790
recyclerView.setLayoutManager(UIUtils.getGridLayoutAt450Dp(this));
8891
recyclerView.setAdapter(mAppUsageAdapter);
@@ -94,6 +97,15 @@ protected void onAuthenticated(Bundle savedInstanceState) {
9497
viewModel.getPackageUsageInfoList().observe(this, packageUsageInfoList -> {
9598
ProgressIndicatorCompat.setVisibility(progressIndicator, false);
9699
mAppUsageAdapter.setDefaultList(packageUsageInfoList);
100+
// Focus on the first item
101+
recyclerView.post(() -> {
102+
if (recyclerView.getChildCount() > 0) {
103+
View firstChild = recyclerView.getChildAt(0);
104+
if (firstChild != null) {
105+
AccessibilityUtils.requestAccessibilityFocus(firstChild);
106+
}
107+
}
108+
});
97109
});
98110
viewModel.getPackageUsageInfo().observe(this, packageUsageInfo -> {
99111
AppUsageDetailsDialog fragment = AppUsageDetailsDialog.getInstance(packageUsageInfo,

app/src/main/java/io/github/muntashirakon/AppManager/usage/AppUsageAdapter.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,17 @@ public void onBindViewHolder(@NonNull ListHeaderViewHolder holder) {
145145
int intervalType = mActivity.viewModel.getCurrentInterval();
146146
long duration = mActivity.viewModel.getTotalScreenTime();
147147
long date = mActivity.viewModel.getCurrentDate();
148-
149-
holder.screenTimeView.setText(DateUtils.getFormattedDuration(mActivity, duration));
150-
holder.usageIntervalView.setText(UsageUtils.getIntervalDescription(mActivity, intervalType, date));
148+
CharSequence formattedDuration = DateUtils.getFormattedDuration(mActivity, duration);
149+
CharSequence intervalDescription = UsageUtils.getIntervalDescription(mActivity, intervalType, date);
150+
StringBuilder contentDescription = new StringBuilder()
151+
.append(mActivity.getString(R.string.app_usage))
152+
.append(" ")
153+
.append(intervalDescription)
154+
.append(". ")
155+
.append(formattedDuration);
156+
holder.itemView.setContentDescription(contentDescription);
157+
holder.screenTimeView.setText(formattedDuration);
158+
holder.usageIntervalView.setText(intervalDescription);
151159
holder.nextButton.setVisibility(UsageUtils.hasNextDay(date) ? View.VISIBLE : View.INVISIBLE);
152160
holder.nextButton.setOnClickListener(v -> mActivity.viewModel.loadNext());
153161
holder.previousButton.setOnClickListener(v -> mActivity.viewModel.loadPrevious());

0 commit comments

Comments
 (0)