diff options
author | Tijs-B <tijs.bergmans@telenet.be> | 2021-06-18 09:20:26 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-18 09:20:26 +0000 |
commit | cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4 (patch) | |
tree | b6477b63b54809c90186a2447e4d5fe2689df962 | |
parent | f898bda4aa8e97a31085e3d2e85feb6db0d7f576 (diff) | |
parent | 92a1c1d1aecc6814a49f490f97fdbb03530bba3a (diff) | |
download | infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.tar infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.tar.gz infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.tar.bz2 infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.tar.lz infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.tar.xz infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.tar.zst infinity-for-reddit-cfe7ccbf59f6df0f778a8c6fe18218ea80b626e4.zip |
Merge branch 'Docile-Alligator:master' into master
11 files changed, 223 insertions, 5 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4cde57e7..5e6fbdc6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,8 @@ android:theme="@style/AppTheme" android:usesCleartextTraffic="true" tools:replace="android:label"> - <activity android:name=".activities.LockScreenActivity" + <activity + android:name=".activities.LockScreenActivity" android:theme="@style/AppTheme.NoActionBar" /> <activity android:name=".activities.AnonymousSubscriptionsActivity" @@ -429,6 +430,10 @@ android:name=".services.SubmitPostService" android:enabled="true" android:exported="false" /> + + <service + android:name=".services.MaterialYouService" + android:exported="false" /> </application> </manifest>
\ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java index 922642f2..939858c7 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java @@ -73,6 +73,7 @@ import ml.docilealligator.infinityforreddit.fragments.ViewRedditGalleryImageOrGi import ml.docilealligator.infinityforreddit.fragments.ViewRedditGalleryVideoFragment; import ml.docilealligator.infinityforreddit.services.DownloadMediaService; import ml.docilealligator.infinityforreddit.services.DownloadRedditVideoService; +import ml.docilealligator.infinityforreddit.services.MaterialYouService; import ml.docilealligator.infinityforreddit.services.SubmitPostService; import ml.docilealligator.infinityforreddit.settings.AdvancedPreferenceFragment; import ml.docilealligator.infinityforreddit.settings.CrashReportsFragment; @@ -266,4 +267,6 @@ public interface AppComponent { void inject(AnonymousSubscriptionsActivity anonymousSubscriptionsActivity); void inject(LockScreenActivity lockScreenActivity); + + void inject(MaterialYouService materialYouService); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java index 1514b745..1ea45d67 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java @@ -1,6 +1,7 @@ package ml.docilealligator.infinityforreddit; import android.app.Application; +import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Bundle; @@ -16,6 +17,7 @@ import com.livefront.bridge.SavedStateHandler; import org.greenrobot.eventbus.EventBus; import ml.docilealligator.infinityforreddit.broadcastreceivers.NetworkWifiStatusReceiver; +import ml.docilealligator.infinityforreddit.broadcastreceivers.WallpaperChangeReceiver; import ml.docilealligator.infinityforreddit.events.ChangeNetworkStatusEvent; import ml.docilealligator.infinityforreddit.utils.Utils; @@ -87,6 +89,8 @@ public class Infinity extends Application implements LifecycleObserver { mNetworkWifiStatusReceiver = new NetworkWifiStatusReceiver(() -> EventBus.getDefault().post(new ChangeNetworkStatusEvent(Utils.getConnectedNetwork(getApplicationContext())))); registerReceiver(mNetworkWifiStatusReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + + registerReceiver(new WallpaperChangeReceiver(), new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED)); } // @OnLifecycleEvent(Lifecycle.Event.ON_START) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java index 5142704b..408a6617 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java @@ -30,6 +30,7 @@ import androidx.constraintlayout.widget.Barrier; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; import androidx.core.graphics.drawable.DrawableCompat; +import androidx.paging.PagedListAdapter; import androidx.paging.PagingDataAdapter; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ItemTouchHelper; @@ -104,7 +105,7 @@ import retrofit2.Retrofit; * Created by alex on 2/25/18. */ -public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerView.ViewHolder> implements CacheManager { +public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHolder> implements CacheManager { private static final int VIEW_TYPE_POST_CARD_VIDEO_AUTOPLAY_TYPE = 1; private static final int VIEW_TYPE_POST_CARD_VIDEO_AND_GIF_PREVIEW_TYPE = 2; private static final int VIEW_TYPE_POST_CARD_IMAGE_AND_GIF_AUTOPLAY_TYPE = 3; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/WallpaperChangeReceiver.java b/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/WallpaperChangeReceiver.java new file mode 100644 index 00000000..8028cdfc --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/broadcastreceivers/WallpaperChangeReceiver.java @@ -0,0 +1,15 @@ +package ml.docilealligator.infinityforreddit.broadcastreceivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import ml.docilealligator.infinityforreddit.services.MaterialYouService; + +public class WallpaperChangeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Intent materialYouIntent = new Intent(context, MaterialYouService.class); + context.startService(materialYouIntent); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/services/MaterialYouService.java b/app/src/main/java/ml/docilealligator/infinityforreddit/services/MaterialYouService.java new file mode 100644 index 00000000..ec4448ff --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/services/MaterialYouService.java @@ -0,0 +1,46 @@ +package ml.docilealligator.infinityforreddit.services; + +import android.app.IntentService; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Handler; + +import java.util.concurrent.Executor; + +import javax.inject.Inject; +import javax.inject.Named; + +import ml.docilealligator.infinityforreddit.Infinity; +import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; +import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; +import ml.docilealligator.infinityforreddit.utils.MaterialYouUtils; + +public class MaterialYouService extends IntentService { + + @Inject + @Named("light_theme") + SharedPreferences lightThemeSharedPreferences; + @Inject + @Named("dark_theme") + SharedPreferences darkThemeSharedPreferences; + @Inject + @Named("amoled_theme") + SharedPreferences amoledThemeSharedPreferences; + @Inject + RedditDataRoomDatabase redditDataRoomDatabase; + @Inject + CustomThemeWrapper customThemeWrapper; + @Inject + Executor executor; + + public MaterialYouService() { + super("MaterialYouService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + ((Infinity) getApplication()).getAppComponent().inject(this); + MaterialYouUtils.changeTheme(this, executor, new Handler(), customThemeWrapper, + lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences); + } +}
\ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java index fba59d25..c4d03d48 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/settings/ThemePreferenceFragment.java @@ -2,9 +2,11 @@ package ml.docilealligator.infinityforreddit.settings; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; @@ -19,17 +21,21 @@ import androidx.preference.SwitchPreference; import org.greenrobot.eventbus.EventBus; +import java.util.concurrent.Executor; + import javax.inject.Inject; +import javax.inject.Named; +import ml.docilealligator.infinityforreddit.Infinity; +import ml.docilealligator.infinityforreddit.R; +import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.activities.CustomThemeListingActivity; import ml.docilealligator.infinityforreddit.activities.CustomizeThemeActivity; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeViewModel; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.events.RecreateActivityEvent; -import ml.docilealligator.infinityforreddit.Infinity; -import ml.docilealligator.infinityforreddit.R; -import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.utils.CustomThemeSharedPreferencesUtils; +import ml.docilealligator.infinityforreddit.utils.MaterialYouUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY; @@ -44,9 +50,20 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat { private AppCompatActivity activity; @Inject + @Named("light_theme") + SharedPreferences lightThemeSharedPreferences; + @Inject + @Named("dark_theme") + SharedPreferences darkThemeSharedPreferences; + @Inject + @Named("amoled_theme") + SharedPreferences amoledThemeSharedPreferences; + @Inject RedditDataRoomDatabase redditDataRoomDatabase; @Inject CustomThemeWrapper customThemeWrapper; + @Inject + Executor executor; public CustomThemeViewModel customThemeViewModel; @Override @@ -61,6 +78,7 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat { Preference customizeDarkThemePreference = findPreference(SharedPreferencesUtils.CUSTOMIZE_DARK_THEME); Preference customizeAmoledThemePreference = findPreference(SharedPreferencesUtils.CUSTOMIZE_AMOLED_THEME); Preference selectAndCustomizeThemePreference = findPreference(SharedPreferencesUtils.MANAGE_THEMES); + SwitchPreference enableMaterialYouSwitchPreference = findPreference(SharedPreferencesUtils.ENABLE_MATERIAL_YOU); boolean systemDefault = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; if (themePreference != null && amoledDarkSwitch != null) { @@ -151,6 +169,17 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat { }); } + if (enableMaterialYouSwitchPreference != null) { + Handler handler = new Handler(); + enableMaterialYouSwitchPreference.setOnPreferenceChangeListener((preference, newValue) -> { + if (true) { + MaterialYouUtils.changeTheme(activity, executor, new Handler(), customThemeWrapper, + lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences); + } + return true; + }); + } + customThemeViewModel = new ViewModelProvider(this, new CustomThemeViewModel.Factory(redditDataRoomDatabase)) .get(CustomThemeViewModel.class); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java new file mode 100644 index 00000000..a9cfc226 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/MaterialYouUtils.java @@ -0,0 +1,102 @@ +package ml.docilealligator.infinityforreddit.utils; + +import android.app.WallpaperColors; +import android.app.WallpaperManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.os.Build; +import android.os.Handler; + +import androidx.annotation.ColorInt; + +import org.greenrobot.eventbus.EventBus; + +import java.util.concurrent.Executor; + +import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; +import ml.docilealligator.infinityforreddit.events.RecreateActivityEvent; + +public class MaterialYouUtils { + public static void changeTheme(Context context, Executor executor, Handler handler, + CustomThemeWrapper customThemeWrapper, + SharedPreferences lightThemeSharedPreferences, + SharedPreferences darkThemeSharedPreferences, + SharedPreferences amoledThemeSharedPreferences) { + executor.execute(() -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); + WallpaperColors wallpaperColors = wallpaperManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM); + + if (wallpaperColors != null) { + int colorPrimaryInt = shiftColorTo255(wallpaperColors.getPrimaryColor().toArgb(), 0.4); + int colorPrimaryDarkInt = shiftColorTo0(colorPrimaryInt, 0.4); + int backgroundColor = shiftColorTo255(colorPrimaryInt, 0.6); + int cardViewBackgroundColor = shiftColorTo255(colorPrimaryInt, 0.9); + Color colorAccent = wallpaperColors.getSecondaryColor(); + int colorAccentInt = shiftColorTo255(colorAccent == null ? customThemeWrapper.getColorAccent() : colorAccent.toArgb(), 0.4); + + int colorPrimaryAppropriateTextColor = getAppropriateTextColor(colorPrimaryInt); + int backgroundColorAppropriateTextColor = getAppropriateTextColor(backgroundColor); + + lightThemeSharedPreferences.edit().putInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY_DARK, colorPrimaryDarkInt) + .putInt(CustomThemeSharedPreferencesUtils.COLOR_ACCENT, colorAccentInt) + .putInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY_LIGHT_THEME, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.BACKGROUND_COLOR, backgroundColor) + .putInt(CustomThemeSharedPreferencesUtils.CARD_VIEW_BACKGROUND_COLOR, cardViewBackgroundColor) + .putInt(CustomThemeSharedPreferencesUtils.COMMENT_BACKGROUND_COLOR, cardViewBackgroundColor) + .putInt(CustomThemeSharedPreferencesUtils.BOTTOM_APP_BAR_BACKGROUND_COLOR, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.NAV_BAR_COLOR, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.PRIMARY_TEXT_COLOR, backgroundColorAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.BOTTOM_APP_BAR_ICON_COLOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.PRIMARY_ICON_COLOR, backgroundColorAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.FAB_ICON_COLOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.TOOLBAR_PRIMARY_TEXT_AND_ICON_COLOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.TOOLBAR_SECONDARY_TEXT_COLOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_COLLAPSED_COLLAPSING_TOOLBAR_TAB_INDICATOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_COLLAPSED_COLLAPSING_TOOLBAR_TEXT_COLOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_COLLAPSED_COLLAPSING_TOOLBAR_TAB_BACKGROUND, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_EXPANDED_COLLAPSING_TOOLBAR_TAB_BACKGROUND, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_EXPANDED_COLLAPSING_TOOLBAR_TAB_INDICATOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_EXPANDED_COLLAPSING_TOOLBAR_TEXT_COLOR, colorPrimaryAppropriateTextColor) + .putInt(CustomThemeSharedPreferencesUtils.CIRCULAR_PROGRESS_BAR_BACKGROUND, colorPrimaryInt) + .putBoolean(CustomThemeSharedPreferencesUtils.LIGHT_STATUS_BAR, getAppropriateTextColor(colorPrimaryDarkInt) == Color.toArgb(Color.BLACK)) + .apply(); + darkThemeSharedPreferences.edit() + .putInt(CustomThemeSharedPreferencesUtils.COLOR_ACCENT, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY_LIGHT_THEME, colorPrimaryInt) + .apply(); + amoledThemeSharedPreferences.edit() + .putInt(CustomThemeSharedPreferencesUtils.COLOR_ACCENT, colorPrimaryInt) + .putInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY_LIGHT_THEME, colorPrimaryInt) + .apply(); + + handler.post(() -> EventBus.getDefault().post(new RecreateActivityEvent())); + } + } + }); + } + + private static int shiftColorTo255(int color, double ratio) { + int offset = (int) (Math.min(Math.min(255 - Color.red(color), 255 - Color.green(color)), 255 - Color.blue(color)) * ratio); + return Color.argb(Color.alpha(color), Color.red(color) + offset, + Color.green(color) + offset, + Color.blue(color) + offset); + } + + private static int shiftColorTo0(int color, double ratio) { + int offset = (int) (Math.min(Math.min(Color.red(color), Color.green(color)), Color.blue(color)) * ratio); + return Color.argb(Color.alpha(color), Color.red(color) - offset, + Color.green(color) - offset, + Color.blue(color) - offset); + + } + + @ColorInt + public static int getAppropriateTextColor(@ColorInt int color) { + // Counting the perceptive luminance - human eye favors green color... + double luminance = 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255; + return luminance < 0.5 ? Color.BLACK : Color.WHITE; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java index 2795138d..5eecceb1 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/SharedPreferencesUtils.java @@ -180,6 +180,7 @@ public class SharedPreferencesUtils { public static final String NUMBER_OF_COLUMNS_IN_POST_FEED_LANDSCAPE_CARD_LAYOUT_2 = "number_of_columns_in_post_feed_landscape_card_layout_2"; public static final String DISABLE_NSFW_FOREVER = "disable_nsfw_forever"; public static final String SHOW_ONLY_ONE_COMMENT_LEVEL_INDICATOR = "show_only_one_comment_level_indicator"; + public static final String ENABLE_MATERIAL_YOU = "enable_material_you"; public static final String DEFAULT_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit_preferences"; public static final String MAIN_PAGE_TABS_SHARED_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit.main_page_tabs"; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce33e48f..abb5c5b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -457,6 +457,9 @@ <string name="settings_customize_dark_theme_title">Dark Theme</string> <string name="settings_customize_amoled_theme_title">Amoled Theme</string> <string name="settings_manage_themes_title">Manage Themes</string> + <string name="settings_category_material_you_title">Material You</string> + <string name="settings_enable_material_you_title">Enable Material You</string> + <string name="settings_enable_material_you_summary">Personalize Infinity based on Your Wallpaper</string> <string name="settings_custom_theme_cannot_apply_to_settings_page_summary">Custom themes cannot be applied to settings page (except toolbar, status bar and navigation bar).</string> <string name="settings_advanced_master_title">Advanced</string> <string name="settings_delete_all_subreddits_data_in_database_title">Delete All Subreddits in Database</string> diff --git a/app/src/main/res/xml/theme_preferences.xml b/app/src/main/res/xml/theme_preferences.xml index f4fb02a8..3f726ec0 100644 --- a/app/src/main/res/xml/theme_preferences.xml +++ b/app/src/main/res/xml/theme_preferences.xml @@ -40,6 +40,15 @@ app:icon="@drawable/ic_edit_24dp" app:title="@string/settings_manage_themes_title" /> + <PreferenceCategory + app:title="@string/settings_category_material_you_title" /> + + <SwitchPreference + app:defaultValue="false" + app:key="enable_material_you" + app:title="@string/settings_enable_material_you_title" + app:summary="@string/settings_enable_material_you_summary" /> + <Preference app:icon="@drawable/ic_info_preference_24dp" app:summary="@string/settings_custom_theme_cannot_apply_to_settings_page_summary" |