[Android] Add method to extend touch area without changing View appearances

This commit is contained in:
wchen342
2023-09-22 21:12:06 +03:00
parent 988f725c9e
commit d8d4eb036c
16 changed files with 299 additions and 27 deletions
+2
View File
@@ -442,11 +442,13 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/util/BraveDbUtil.java",
"../../brave/android/java/org/chromium/chrome/browser/util/BraveDynamicColors.java",
"../../brave/android/java/org/chromium/chrome/browser/util/BraveReferrer.java",
"../../brave/android/java/org/chromium/chrome/browser/util/BraveTouchUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/util/ConfigurationUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/util/ImageUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/util/LiveDataUtil.java",
"../../brave/android/java/org/chromium/chrome/browser/util/PackageUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/util/TabUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/util/TouchDelegateComposite.java",
"../../brave/android/java/org/chromium/chrome/browser/util/Triple.java",
"../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java",
"../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java",
@@ -73,6 +73,7 @@ import org.chromium.chrome.browser.local_database.DisplayAdsTable;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.rate.BraveRateDialogFragment;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.chrome.browser.util.ConfigurationUtils;
import org.chromium.chrome.browser.util.TabUtils;
import org.chromium.url.mojom.Url;
@@ -374,6 +375,7 @@ public class CardBuilderFeedCard {
int displayHeight = mActivity.getResources().getDisplayMetrics().heightPixels;
TableRow rowTop = new TableRow(mActivity);
TextView topText = new TextView(mActivity);
BraveTouchUtils.ensureMinTouchTarget(topText);
TableRow row1 = new TableRow(mActivity);
TableRow row2 = new TableRow(mActivity);
@@ -38,6 +38,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.local_database.DatabaseHelper;
import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder;
import org.chromium.chrome.browser.notifications.BravePermissionUtils;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.permissions.PermissionConstants;
@@ -68,8 +69,11 @@ public class BraveStatsBottomSheetDialogFragment extends BottomSheetDialogFragme
private LinearLayout websitesLayout;
private LinearLayout trackersLayout;
private RadioButton monthRadioButton;
private RadioButton monthsRadioButton;
private RadioButton mWeekRadioButton;
private RadioButton mMonthRadioButton;
private RadioButton mMonthsRadioButton;
private RadioButton mTrackersRadioButton;
private RadioButton mWebsitesRadioButton;
private View statsNotificationView;
private int selectedType = WEBSITES;
@@ -128,8 +132,11 @@ public class BraveStatsBottomSheetDialogFragment extends BottomSheetDialogFragme
}
});
monthRadioButton = view.findViewById(R.id.month_radio);
monthsRadioButton = view.findViewById(R.id.months_radio);
mWeekRadioButton = view.findViewById(R.id.week_radio);
mMonthRadioButton = view.findViewById(R.id.month_radio);
mMonthsRadioButton = view.findViewById(R.id.months_radio);
mTrackersRadioButton = view.findViewById(R.id.trackers_radio);
mWebsitesRadioButton = view.findViewById(R.id.websites_radio);
LinearLayout layout = view.findViewById(R.id.brave_stats_layout);
adsTrackersCountText = layout.findViewById(R.id.ads_trackers_count_text);
@@ -143,6 +150,12 @@ public class BraveStatsBottomSheetDialogFragment extends BottomSheetDialogFragme
braveStatsSubSectionText = layout.findViewById(R.id.brave_stats_sub_section_text);
statsNotificationView = view.findViewById(R.id.brave_stats_notification_permission);
BraveTouchUtils.ensureMinTouchTarget(mWeekRadioButton);
BraveTouchUtils.ensureMinTouchTarget(mMonthRadioButton);
BraveTouchUtils.ensureMinTouchTarget(mMonthsRadioButton);
BraveTouchUtils.ensureMinTouchTarget(mTrackersRadioButton);
BraveTouchUtils.ensureMinTouchTarget(mWebsitesRadioButton);
RadioGroup statTypeRadioGroup = layout.findViewById(R.id.stat_type_radio_group);
statTypeRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
@@ -297,20 +310,20 @@ public class BraveStatsBottomSheetDialogFragment extends BottomSheetDialogFragme
// Check for month option
if (adsTrackersCountToCheckForMonth > 0) {
monthRadioButton.setEnabled(true);
monthRadioButton.setAlpha(1.0f);
mMonthRadioButton.setEnabled(true);
mMonthRadioButton.setAlpha(1.0f);
} else {
monthRadioButton.setEnabled(false);
monthRadioButton.setAlpha(0.2f);
mMonthRadioButton.setEnabled(false);
mMonthRadioButton.setAlpha(0.2f);
}
// Check for 3 month option
if (adsTrackersCountToCheckFor3Month > 0) {
monthsRadioButton.setEnabled(true);
monthsRadioButton.setAlpha(1.0f);
mMonthsRadioButton.setEnabled(true);
mMonthsRadioButton.setAlpha(1.0f);
} else {
monthsRadioButton.setEnabled(false);
monthsRadioButton.setAlpha(0.2f);
mMonthsRadioButton.setEnabled(false);
mMonthsRadioButton.setAlpha(0.2f);
}
showWebsitesTrackers();
}
@@ -51,6 +51,7 @@ import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.set_default_browser.BraveSetDefaultBrowserUtils;
import org.chromium.chrome.browser.util.BraveConstants;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.chrome.browser.util.PackageUtils;
import org.chromium.ui.base.DeviceFormFactor;
@@ -185,6 +186,16 @@ public class WelcomeOnboardingActivity extends FirstRunActivityBase {
bottomLeafParams.topMargin = margin;
mVLeafAlignBottom.setLayoutParams(bottomLeafParams);
}
if (mBtnPositive != null) {
BraveTouchUtils.ensureMinTouchTarget(mBtnPositive);
}
if (mCheckboxCrash != null) {
BraveTouchUtils.ensureMinTouchTarget(mCheckboxCrash);
}
if (mCheckboxP3a != null) {
BraveTouchUtils.ensureMinTouchTarget(mCheckboxP3a);
}
}
private void onClickViews() {
@@ -53,6 +53,7 @@ import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.BackgroundImagesPreferences;
import org.chromium.chrome.browser.util.BraveConstants;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.chrome.browser.util.TabUtils;
import org.chromium.components.user_prefs.UserPrefs;
@@ -605,6 +606,7 @@ public class BraveNtpAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
(TextView) itemView.findViewById(R.id.brave_stats_text_time_count);
this.estTimeSavedCountTextTv =
(TextView) itemView.findViewById(R.id.brave_stats_text_time_count_text);
BraveTouchUtils.ensureMinTouchTarget(this.hideStatsImg);
}
}
@@ -644,6 +646,7 @@ public class BraveNtpAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
(FloatingActionButton) itemView.findViewById(R.id.super_referral_logo);
this.creditTv = (TextView) itemView.findViewById(R.id.credit_text);
this.sponsoredLogo = (ImageView) itemView.findViewById(R.id.sponsored_logo);
BraveTouchUtils.ensureMinTouchTarget(this.creditTv);
}
}
@@ -661,6 +664,8 @@ public class BraveNtpAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
optinLearnMore = (TextView) itemView.findViewById(R.id.optin_learnmore);
optinTv = (TextView) itemView.findViewById(R.id.optin_button_text);
optinLoadingSpinner = (ProgressBar) itemView.findViewById(R.id.optin_loading_spinner);
BraveTouchUtils.ensureMinTouchTarget(optinButton);
BraveTouchUtils.ensureMinTouchTarget(optinLearnMore);
}
}
@@ -37,6 +37,7 @@ import org.chromium.chrome.browser.qrreader.BarcodeTracker;
import org.chromium.chrome.browser.qrreader.BarcodeTrackerFactory;
import org.chromium.chrome.browser.qrreader.CameraSource;
import org.chromium.chrome.browser.qrreader.CameraSourcePreview;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import java.io.IOException;
@@ -80,6 +81,9 @@ public class BraveLocationBarQRDialogFragment
mCameraSourcePreview = (CameraSourcePreview) view.findViewById(R.id.preview);
createCameraSource(true, false);
BraveTouchUtils.ensureMinTouchTarget(backImageView);
try {
startCameraSource();
} catch (SecurityException exc) {
@@ -27,6 +27,7 @@ import androidx.fragment.app.Fragment;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveRewardsHelper;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.util.BraveTouchUtils;
public class BraveRewardsOnboardingFragment extends Fragment {
private OnViewPagerAction onViewPagerAction;
@@ -70,6 +71,8 @@ public class BraveRewardsOnboardingFragment extends Fragment {
btnSkip = root.findViewById(R.id.btn_skip);
btnNext = root.findViewById(R.id.btn_next);
BraveTouchUtils.ensureMinTouchTarget(btnSkip);
}
private void setActions() {
@@ -78,6 +78,7 @@ import org.chromium.chrome.browser.rewards.onboarding.RewardsOnboarding;
import org.chromium.chrome.browser.rewards.tipping.RewardsTippingBannerActivity;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.BraveConstants;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.chrome.browser.util.ConfigurationUtils;
import org.chromium.chrome.browser.util.PackageUtils;
import org.chromium.chrome.browser.util.TabUtils;
@@ -364,6 +365,7 @@ public class BraveRewardsPanel
mPopupWindow.setContentView(mPopupView);
mWalletBalanceProgress = mPopupView.findViewById(R.id.wallet_progress_bar_group);
adjustTouchTargets();
}
// Rewards main layout changes
@@ -1026,13 +1028,14 @@ public class BraveRewardsPanel
&& !PackageUtils.isFirstInstall(mActivity)) {
mPopupView.findViewById(R.id.estimated_earnings_range_group).setVisibility(View.GONE);
mPopupView.findViewById(R.id.estimated_not_connected_group).setVisibility(View.VISIBLE);
mPopupView.findViewById(R.id.bat_ads_balance_learn_more_text)
.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
CustomTabActivity.showInfoPage(mActivity, BRAVE_REWARDS_CHANGES_PAGE);
}
}));
TextView batAdsBalanceLearnMoreText =
mPopupView.findViewById(R.id.bat_ads_balance_learn_more_text);
batAdsBalanceLearnMoreText.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
CustomTabActivity.showInfoPage(mActivity, BRAVE_REWARDS_CHANGES_PAGE);
}
}));
} else {
TextView estimatedRange = mPopupView.findViewById(R.id.estimated_range);
String minValue = BraveRewardsHelper.getFormattedAmount(minEarningsThisMonth);
@@ -1393,6 +1396,7 @@ public class BraveRewardsPanel
CustomTabActivity.showInfoPage(mActivity, BRAVE_REWARDS_PAGE);
}
}));
BraveTouchUtils.ensureMinTouchTarget(learnMoreUnverifiedText);
if (BraveAdsNativeHelper.nativeIsOptedInToNotificationAds(
Profile.getLastUsedRegularProfile())) {
@@ -1415,6 +1419,7 @@ public class BraveRewardsPanel
mActivity, UNVERIFIED_USER_UNSUPPORTED_REGION_PAGE);
}
}));
BraveTouchUtils.ensureMinTouchTarget(rewardsPanelUnverifiedOnSectionLearnMoreText);
if (mBraveRewardsNativeWorker.canConnectAccount()) {
String sectionText = "<b>"
+ mPopupView.getResources().getString(R.string.ready_to_start_earning_text)
@@ -1473,8 +1478,9 @@ public class BraveRewardsPanel
.setOnClickListener(braveRewardsOnboardingClickListener);
mBraveRewardsOnboardingView.findViewById(R.id.btn_skip)
.setOnClickListener(braveRewardsOnboardingClickListener);
mBraveRewardsOnboardingView.findViewById(R.id.btn_start_quick_tour)
.setOnClickListener(braveRewardsOnboardingClickListener);
final View startQuickTourButton =
(View) mBraveRewardsOnboardingView.findViewById(R.id.btn_start_quick_tour);
startQuickTourButton.setOnClickListener(braveRewardsOnboardingClickListener);
mBraveRewardsViewPager =
mBraveRewardsOnboardingView.findViewById(R.id.brave_rewards_view_pager);
@@ -1517,6 +1523,17 @@ public class BraveRewardsPanel
TabLayout braveRewardsTabLayout =
mBraveRewardsOnboardingView.findViewById(R.id.brave_rewards_tab_layout);
braveRewardsTabLayout.setupWithViewPager(mBraveRewardsViewPager, true);
// Try to get the tab view. Not officially supported so wrap in try..catch
try {
LinearLayout tabs = (LinearLayout) braveRewardsTabLayout.getChildAt(0);
for (int i = 0; i < tabs.getChildCount(); ++i) {
BraveTouchUtils.ensureMinTouchTarget(tabs.getChildAt(i));
}
} catch (Exception e) {
Log.e(TAG, "Failed to enlarge touch target on tab:", e);
}
AppCompatImageView modalCloseButton = mBraveRewardsOnboardingView.findViewById(
R.id.brave_rewards_onboarding_layout_modal_close);
modalCloseButton.setOnClickListener((new View.OnClickListener() {
@@ -1531,6 +1548,9 @@ public class BraveRewardsPanel
.setVisibility(View.VISIBLE);
mBraveRewardsOnboardingView.findViewById(R.id.onboarding_action_layout)
.setVisibility(View.GONE);
BraveTouchUtils.ensureMinTouchTarget(modalCloseButton);
BraveTouchUtils.ensureMinTouchTarget(startQuickTourButton);
}
private void panelShadow(boolean isEnable) {
@@ -2206,4 +2226,11 @@ public class BraveRewardsPanel
return R.drawable.ic_logo_zebpay_white;
}
}
private void adjustTouchTargets() {
BraveTouchUtils.ensureMinTouchTarget(mPopupView.findViewById(R.id.estimated_earnings));
BraveTouchUtils.ensureMinTouchTarget(
mPopupView.findViewById(R.id.bat_ads_balance_learn_more_text));
BraveTouchUtils.ensureMinTouchTarget(mPopupView.findViewById(R.id.btn_verify_wallet));
}
}
@@ -33,6 +33,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.notifications.BraveNotificationWarningDialog;
import org.chromium.chrome.browser.notifications.BravePermissionUtils;
import org.chromium.chrome.browser.rewards.BraveRewardsPanel;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.chrome.browser.util.TabUtils;
import org.chromium.ui.permissions.PermissionConstants;
import org.chromium.ui.text.NoUnderlineClickableSpan;
@@ -54,6 +55,7 @@ public class RewardsOnboarding implements BraveRewardsObserver {
private ViewGroup mAllSetLayout;
private ViewGroup mErrorLayout;
private Spinner mCountrySpinner;
private TextView mContinueButton;
private BraveRewardsNativeWorker mBraveRewardsNativeWorker;
@@ -96,6 +98,9 @@ public class RewardsOnboarding implements BraveRewardsObserver {
View howDoseItWorkMainButton = mMainLayout.findViewById(R.id.how_does_it_work_main);
howDoseItWorkMainButton.setOnClickListener(v -> { showRewardsTour(); });
mCountrySpinner = mPopupView.findViewById(R.id.country_spinner);
BraveTouchUtils.ensureMinTouchTarget(mCountrySpinner);
String termsOfServiceText = String.format(
mPopupView.getContext().getString(R.string.brave_rewards_onboarding_tos_text),
mPopupView.getContext().getString(R.string.terms_of_service),
@@ -186,13 +191,11 @@ public class RewardsOnboarding implements BraveRewardsObserver {
}
String[] countryArray = countryList.toArray(new String[countryList.size()]);
Spinner countrySpinner;
countrySpinner = mPopupView.findViewById(R.id.country_spinner);
CountrySelectionSpinnerAdapter countrySelectionSpinnerAdapter =
new CountrySelectionSpinnerAdapter(mActivity, countryList);
countrySpinner.setAdapter(countrySelectionSpinnerAdapter);
countrySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
mCountrySpinner.setAdapter(countrySelectionSpinnerAdapter);
mCountrySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
mContinueButton.setEnabled(pos != 0);
@@ -210,9 +213,9 @@ public class RewardsOnboarding implements BraveRewardsObserver {
mAnchorView.getContext())) {
requestNotificationPermission();
}
if (countrySpinner != null) {
if (mCountrySpinner != null) {
mBraveRewardsNativeWorker.CreateRewardsWallet(
sortedCountryMap.get(countrySpinner.getSelectedItem().toString()));
sortedCountryMap.get(mCountrySpinner.getSelectedItem().toString()));
shouldShowContinueProgress(true);
mContinueButton.setText("");
}
@@ -40,6 +40,7 @@ import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder
import org.chromium.chrome.browser.preferences.BravePrefServiceBridge;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.util.BraveConstants;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.components.browser_ui.settings.FragmentSettingsLauncher;
import org.chromium.components.browser_ui.settings.SettingsLauncher;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
@@ -106,6 +107,13 @@ public class BraveNewsPreferencesV2 extends BravePreferenceFragment
mLayoutChannels = (View) view.findViewById(R.id.layout_channels);
mLayoutFollowing = (View) view.findViewById(R.id.layout_following);
BraveTouchUtils.ensureMinTouchTarget(mBtnTurnOnNews);
BraveTouchUtils.ensureMinTouchTarget(mLayoutChannels);
BraveTouchUtils.ensureMinTouchTarget(mLayoutFollowing);
BraveTouchUtils.ensureMinTouchTarget(mLayoutPopularSources);
BraveTouchUtils.ensureMinTouchTarget(mLayoutSuggestions);
BraveTouchUtils.ensureMinTouchTarget(mTvSearch);
setData();
onClickViews();
}
@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.toolbar.menu_button.BraveMenuButtonCoordinato
import org.chromium.chrome.browser.toolbar.menu_button.MenuButton;
import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonState;
import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
/**
@@ -98,6 +99,7 @@ public class BrowsingModeBottomToolbarCoordinator {
mSearchAccelerator = mToolbarRoot.findViewById(R.id.search_accelerator);
mSearchAccelerator.setOnClickListener(searchAcceleratorListener);
BraveTouchUtils.ensureMinTouchTarget(mSearchAccelerator);
// TODO(amaralp): Make this adhere to MVC framework.
mTabSwitcherButtonView = mToolbarRoot.findViewById(R.id.bottom_tab_switcher_button);
@@ -126,6 +126,7 @@ import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonCoordinator;
import org.chromium.chrome.browser.toolbar.top.NavigationPopup.HistoryDelegate;
import org.chromium.chrome.browser.toolbar.top.ToolbarTablet.OfflineDownloader;
import org.chromium.chrome.browser.util.BraveConstants;
import org.chromium.chrome.browser.util.BraveTouchUtils;
import org.chromium.chrome.browser.util.ConfigurationUtils;
import org.chromium.chrome.browser.util.PackageUtils;
import org.chromium.chrome.browser.widget.quickactionsearchandbookmark.promo.SearchWidgetPromoPanel;
@@ -288,18 +289,21 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
mBraveShieldsButton.setClickable(true);
mBraveShieldsButton.setOnClickListener(this);
mBraveShieldsButton.setOnLongClickListener(this);
BraveTouchUtils.ensureMinTouchTarget(mBraveShieldsButton);
}
if (mBraveRewardsButton != null) {
mBraveRewardsButton.setClickable(true);
mBraveRewardsButton.setOnClickListener(this);
mBraveRewardsButton.setOnLongClickListener(this);
BraveTouchUtils.ensureMinTouchTarget(mBraveRewardsButton);
}
if (mBraveWalletButton != null) {
mBraveWalletButton.setClickable(true);
mBraveWalletButton.setOnClickListener(this);
mBraveWalletButton.setOnLongClickListener(this);
BraveTouchUtils.ensureMinTouchTarget(mBraveWalletButton);
}
mBraveShieldsHandler = new BraveShieldsHandler(getContext());
@@ -1102,6 +1106,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
R.id.brave_rewards_onboarding_modal_tos_pp_text);
tosAndPpText.setMovementMethod(LinkMovementMethod.getInstance());
tosAndPpText.setText(tosTextSS);
BraveTouchUtils.ensureMinTouchTarget(tosAndPpText);
TextView takeQuickTourButton =
braveRewardsOnboardingModalView.findViewById(R.id.take_quick_tour_button);
@@ -1113,6 +1118,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
dialog.dismiss();
}
}));
BraveTouchUtils.ensureMinTouchTarget(takeQuickTourButton);
TextView btnBraveRewards =
braveRewardsOnboardingModalView.findViewById(R.id.start_using_brave_rewards_text);
btnBraveRewards.setOnClickListener((new View.OnClickListener() {
@@ -0,0 +1,100 @@
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.util;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.TouchDelegate;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
public class BraveTouchUtils {
public static final int MIN_TOUCH_TARGET = 48;
/**
* Ensures that the touchable area of [view] equal MIN_TOUCH_TARGET.
*/
public static void ensureMinTouchTarget(View view) {
ensureMinTouchTarget(view, MIN_TOUCH_TARGET);
}
/**
* Ensures that the touchable area of [view] equal [minTarget] by expanding the touch area
* of a view beyond its actual view bounds.
*
* This function was taken from Trackr Android App (https://github.com/android/trackr)
* and adapted to Java. minTarget is in dp instead of px.
*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public static void ensureMinTouchTarget(View view, int minTarget) {
View parent = (View) view.getParent();
if (parent != null) {
parent.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (view.isShown()) {
final Rect bounds = new Rect();
view.getHitRect(bounds);
DisplayMetrics metrics =
view.getContext().getResources().getDisplayMetrics();
int height = (int) Math.round(bounds.height() / metrics.density);
int width = (int) Math.round(bounds.width() / metrics.density);
int extraSpaceStart = 0;
int extraSpaceEnd = 0;
if (height < minTarget) {
extraSpaceStart = (int) Math.floor((minTarget - height) / 2f);
extraSpaceEnd = minTarget - height - extraSpaceStart;
extraSpaceStart = (int) Math.ceil(extraSpaceStart * metrics.density);
extraSpaceEnd = (int) Math.ceil(extraSpaceEnd * metrics.density);
bounds.top -= extraSpaceStart;
bounds.bottom += extraSpaceEnd;
}
if (width < minTarget) {
extraSpaceStart = (int) Math.floor((minTarget - width) / 2f);
extraSpaceEnd = minTarget - width - extraSpaceStart;
extraSpaceStart = (int) Math.ceil(extraSpaceStart * metrics.density);
extraSpaceEnd = (int) Math.ceil(extraSpaceEnd * metrics.density);
bounds.left -= extraSpaceStart;
bounds.right += extraSpaceEnd;
}
ensureTouchDelegateComposite(parent, view);
((TouchDelegateComposite) parent.getTouchDelegate())
.addDelegate(bounds, view);
}
}
});
}
}
private static void ensureTouchDelegateComposite(View parent, View view) {
TouchDelegate parentTouchDelegate = parent.getTouchDelegate();
if (parentTouchDelegate == null) {
parent.setTouchDelegate(new TouchDelegateComposite(new Rect(), view));
} else if (!(parentTouchDelegate instanceof TouchDelegateComposite)) {
TouchDelegateComposite touchDelegateComposite =
new TouchDelegateComposite(new Rect(), view);
touchDelegateComposite.addDelegate(parentTouchDelegate);
parent.setTouchDelegate(touchDelegateComposite);
}
}
}
@@ -0,0 +1,4 @@
Name: Trackr Android App
URL: https://github.com/android/trackr/
License: Apache-2.0
License File: /brave/common/licenses/Apache-2.0
@@ -0,0 +1,80 @@
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.util;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Build;
import android.util.ArrayMap;
import android.util.Pair;
import android.view.MotionEvent;
import android.view.TouchDelegate;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* A class holding multiple TouchDelegates to ensure touch events are dispatched correctly from
* parent to all children.
*/
public class TouchDelegateComposite extends TouchDelegate {
private List<Pair<View, Pair<Rect, TouchDelegate>>> mDelegates = new ArrayList<>(4);
public TouchDelegateComposite(Rect bounds, View view) {
super(bounds, view);
}
/**
* Add a pre-existing TouchDelegate. Cannot get bounds and view from existing delegate.
*/
public void addDelegate(TouchDelegate delegate) {
mDelegates.add(new Pair<>(null, new Pair<>(new Rect(), delegate)));
}
/**
* Add a delegate by bounds and view.
*/
public void addDelegate(Rect bounds, View view) {
boolean dup = false;
mDelegates = mDelegates.stream()
.filter(e -> e.first == null || e.first.getId() != view.getId())
.collect(Collectors.toList());
mDelegates.add(new Pair<>(view, new Pair<>(bounds, new TouchDelegate(bounds, view))));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean handled = false;
float x = event.getX();
float y = event.getY();
for (Pair<View, Pair<Rect, TouchDelegate>> delegate : mDelegates) {
event.setLocation(x, y);
handled = delegate.second.second.onTouchEvent(event) || handled;
}
return handled;
}
@Override
public TouchDelegateInfo getTouchDelegateInfo() {
final ArrayMap<Region, View> targetMap = new ArrayMap<>();
for (Pair<View, Pair<Rect, TouchDelegate>> delegate : mDelegates) {
if (delegate.first == null) continue;
Rect bounds = delegate.second.first;
if (bounds == null) {
bounds = new Rect();
}
targetMap.put(new Region(bounds), delegate.first);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
return new TouchDelegateInfo(targetMap);
}
return null;
}
}
+2
View File
@@ -170,6 +170,8 @@ def AddBraveCredits(root, prune_paths, special_cases, prune_dirs,
os.path.join('brave', 'browser', 'brave_vpn', 'win',
'brave_vpn_wireguard_service'),
os.path.join('brave', 'components', 'filecoin'),
os.path.join('brave', 'android', 'java', 'org', 'chromium', 'chrome',
'browser', 'util'),
]
# Add all Android libraries since they're not directly contained