From b892b7b8d328d640d31bd87ffea888ff98e6d30f Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 12 Oct 2021 16:19:33 +0200 Subject: [PATCH 1/6] Migrate PermissionUtil to Kotlin - Set min SDK to 16 (was 14), because READ_EXTERNAL_STORAGE is minimum 16 - Add new shortcut to Settings.kt class - Use showDialog util function --- dependencies.gradle | 2 +- .../ultrasonic/fragment/SettingsFragment.java | 6 +- .../moire/ultrasonic/util/PermissionUtil.java | 237 ---------------- .../ultrasonic/activity/NavigationActivity.kt | 11 +- .../ultrasonic/fragment/EditServerFragment.kt | 7 +- .../org/moire/ultrasonic/util/FileUtil.kt | 5 +- .../moire/ultrasonic/util/PermissionUtil.kt | 259 ++++++++++++++++++ .../org/moire/ultrasonic/util/Settings.kt | 17 ++ .../kotlin/org/moire/ultrasonic/util/Util.kt | 21 +- 9 files changed, 304 insertions(+), 261 deletions(-) delete mode 100644 ultrasonic/src/main/java/org/moire/ultrasonic/util/PermissionUtil.java create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/PermissionUtil.kt diff --git a/dependencies.gradle b/dependencies.gradle index 70e160bb..0c1bf079 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,5 +1,5 @@ ext.versions = [ - minSdk : 14, + minSdk : 16, targetSdk : 29, compileSdk : 29, // You need to run ./gradlew wrapper after updating the version diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java index 3a7253d7..4be972db 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java @@ -224,8 +224,7 @@ public class SettingsFragment extends PreferenceFragmentCompat } private void setupCacheLocationPreference() { - cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, - FileUtil.getDefaultMusicDirectory().getPath())); + cacheLocation.setSummary(Settings.getCacheLocation()); cacheLocation.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override @@ -431,8 +430,7 @@ public class SettingsFragment extends PreferenceFragmentCompat sharingDefaultExpiration.setSummary(sharingDefaultExpiration.getText()); sharingDefaultDescription.setSummary(sharingDefaultDescription.getText()); sharingDefaultGreeting.setSummary(sharingDefaultGreeting.getText()); - cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, - FileUtil.getDefaultMusicDirectory().getPath())); + cacheLocation.setSummary(Settings.getCacheLocation()); if (!mediaButtonsEnabled.isChecked()) { lockScreenEnabled.setChecked(false); diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/PermissionUtil.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/PermissionUtil.java deleted file mode 100644 index cbf82fa7..00000000 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/PermissionUtil.java +++ /dev/null @@ -1,237 +0,0 @@ -package org.moire.ultrasonic.util; - -import android.Manifest; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.os.Handler; -import android.os.Looper; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.PermissionChecker; - -import com.karumi.dexter.Dexter; -import com.karumi.dexter.MultiplePermissionsReport; -import com.karumi.dexter.PermissionToken; -import com.karumi.dexter.listener.DexterError; -import com.karumi.dexter.listener.PermissionRequest; -import com.karumi.dexter.listener.PermissionRequestErrorListener; -import com.karumi.dexter.listener.multi.MultiplePermissionsListener; - -import org.moire.ultrasonic.R; - -import java.util.List; - -import timber.log.Timber; - -import static androidx.core.content.PermissionChecker.PERMISSION_DENIED; - - -/** - * Contains static functions for Permission handling - */ -public class PermissionUtil { - - private Context activityContext; - private final Context applicationContext; - - public PermissionUtil(Context context) { - applicationContext = context; - } - - public interface PermissionRequestFinishedCallback { - void onPermissionRequestFinished(boolean hasPermission); - } - - public void ForegroundApplicationStarted(Context context) { - this.activityContext = context; - } - - public void ForegroundApplicationStopped() { - activityContext = null; - } - - /** - * This function can be used to handle file access permission failures. - * - * It will check if the failure is because the necessary permissions aren't available, - * and it will request them, if necessary. - * - * @param callback callback function to execute after the permission request is finished - */ - public void handlePermissionFailed(@Nullable final PermissionRequestFinishedCallback callback) { - String currentCachePath = Settings.getPreferences().getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, FileUtil.getDefaultMusicDirectory().getPath()); - String defaultCachePath = FileUtil.getDefaultMusicDirectory().getPath(); - - // Ultrasonic can do nothing about this error when the Music Directory is already set to the default. - if (currentCachePath.compareTo(defaultCachePath) == 0) return; - - if ((PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_DENIED) || - (PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.READ_EXTERNAL_STORAGE) == PERMISSION_DENIED)) { - // While we request permission, the Music Directory is temporarily reset to its default location - setCacheLocation(applicationContext, FileUtil.getDefaultMusicDirectory().getPath()); - // If the application is not running, we can't notify the user - if (activityContext == null) return; - requestFailedPermission(activityContext, currentCachePath, callback); - } else { - setCacheLocation(applicationContext, FileUtil.getDefaultMusicDirectory().getPath()); - // If the application is not running, we can't notify the user - if (activityContext != null) { - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - showWarning(activityContext, activityContext.getString(R.string.permissions_message_box_title), activityContext.getString(R.string.permissions_access_error), null); - } - }); - } - if (callback != null) { - callback.onPermissionRequestFinished(false); - } - } - } - - /** - * This function requests permission to access the filesystem. - * It can be used to request the permission initially, e.g. when the user decides to use a non-default folder for the cache - * @param context context for the operation - * @param callback callback function to execute after the permission request is finished - */ - public static void requestInitialPermission(final Context context, final PermissionRequestFinishedCallback callback) { - Dexter.withContext(context) - .withPermissions( - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE) - .withListener(new MultiplePermissionsListener() { - @Override - public void onPermissionsChecked(MultiplePermissionsReport report) { - if (report.areAllPermissionsGranted()) { - Timber.i("Permission granted to read / write external storage"); - if (callback != null) callback.onPermissionRequestFinished(true); - return; - } - - if (report.isAnyPermissionPermanentlyDenied()) { - Timber.i("Found permanently denied permission to read / write external storage, offering settings"); - showSettingsDialog(context); - if (callback != null) callback.onPermissionRequestFinished(false); - return; - } - - Timber.i("At least one permission is missing to read / write external storage"); - showWarning(context, context.getString(R.string.permissions_message_box_title), - context.getString(R.string.permissions_rationale_description_initial), null); - if (callback != null) callback.onPermissionRequestFinished(false); - } - - @Override - public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { - showWarning(context, context.getString(R.string.permissions_rationale_title), - context.getString(R.string.permissions_rationale_description_initial), token); - } - }).withErrorListener(new PermissionRequestErrorListener() { - @Override - public void onError(DexterError error) { - Timber.e("An error has occurred during checking permissions with Dexter: %s", error.toString()); - } - }) - .check(); - } - - private static void setCacheLocation(Context context, String cacheLocation) { - Settings.getPreferences().edit() - .putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, cacheLocation) - .apply(); - } - - private static void requestFailedPermission(final Context context, final String cacheLocation, final PermissionRequestFinishedCallback callback) { - Dexter.withContext(context) - .withPermissions( - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE) - .withListener(new MultiplePermissionsListener() { - @Override - public void onPermissionsChecked(MultiplePermissionsReport report) { - if (report.areAllPermissionsGranted()) { - Timber.i("Permission granted to use cache directory %s", cacheLocation); - setCacheLocation(context, cacheLocation); - if (callback != null) callback.onPermissionRequestFinished(true); - return; - } - - if (report.isAnyPermissionPermanentlyDenied()) { - Timber.i("Found permanently denied permission to use cache directory %s, offering settings", cacheLocation); - showSettingsDialog(context); - if (callback != null) callback.onPermissionRequestFinished(false); - return; - } - - Timber.i("At least one permission is missing to use directory %s ", cacheLocation); - setCacheLocation(context, FileUtil.getDefaultMusicDirectory().getPath()); - showWarning(context, context.getString(R.string.permissions_message_box_title), - context.getString(R.string.permissions_permission_missing), null); - if (callback != null) callback.onPermissionRequestFinished(false); - } - - @Override - public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { - showWarning(context, context.getString(R.string.permissions_rationale_title), - context.getString(R.string.permissions_rationale_description_failed), token); - } - }).withErrorListener(new PermissionRequestErrorListener() { - @Override - public void onError(DexterError error) { - Timber.e("An error has occurred during checking permissions with Dexter: %s", error.toString()); - } - }) - .check(); - } - - private static void showSettingsDialog(final Context context) { - AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Dialog); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(context.getString(R.string.permissions_permanent_denial_title)); - builder.setMessage(context.getString(R.string.permissions_permanent_denial_description)); - - builder.setPositiveButton(context.getString(R.string.permissions_open_settings), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - openSettings(context); - } - }); - - builder.setNegativeButton(context.getString(R.string.common_cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - setCacheLocation(context, FileUtil.getDefaultMusicDirectory().getPath()); - dialog.cancel(); - } - }); - - builder.show(); - } - - private static void openSettings(Context context) { - Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - i.addCategory(Intent.CATEGORY_DEFAULT); - i.setData(Uri.parse("package:" + context.getPackageName())); - context.startActivity(i); - } - - private static void showWarning(Context context, String title, String text, final PermissionToken token) { - AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.Theme_AppCompat_Dialog); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(title); - builder.setMessage(text); - builder.setPositiveButton(context.getString(R.string.common_ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - if (token != null) token.continuePermissionRequest(); - } - }); - builder.show(); - } -} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index f2e9a626..dc9ffe66 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -83,7 +83,7 @@ class NavigationActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { setUncaughtExceptionHandler() - permissionUtil.ForegroundApplicationStarted(this) + permissionUtil.onForegroundApplicationStarted(this) Util.applyTheme(this) super.onCreate(savedInstanceState) @@ -198,7 +198,7 @@ class NavigationActivity : AppCompatActivity() { nowPlayingEventDistributor.unsubscribe(nowPlayingEventListener) themeChangedEventDistributor.unsubscribe(themeChangedEventListener) imageLoaderProvider.clearImageLoader() - permissionUtil.ForegroundApplicationStopped() + permissionUtil.onForegroundApplicationStopped() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { @@ -304,12 +304,7 @@ class NavigationActivity : AppCompatActivity() { PreferenceManager.setDefaultValues(this, R.xml.settings, false) val preferences = Settings.preferences if (!preferences.contains(Constants.PREFERENCES_KEY_CACHE_LOCATION)) { - val editor = preferences.edit() - editor.putString( - Constants.PREFERENCES_KEY_CACHE_LOCATION, - FileUtil.defaultMusicDirectory.path - ) - editor.apply() + Settings.cacheLocation = FileUtil.defaultMusicDirectory.path } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 077a7587..57e75832 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -415,10 +415,9 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { } Util.showDialog( - activity, - android.R.drawable.ic_dialog_info, - R.string.settings_testing_ok, - dialogText + context = requireActivity(), + titleId = R.string.settings_testing_ok, + message = dialogText ) } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/FileUtil.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/FileUtil.kt index af5690e6..f9a03051 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/FileUtil.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/FileUtil.kt @@ -253,9 +253,8 @@ object FileUtil { @JvmStatic val musicDirectory: File get() { - val path = Settings.preferences - .getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, defaultMusicDirectory.path) - val dir = File(path!!) + val path = Settings.cacheLocation + val dir = File(path) val hasAccess = ensureDirectoryExistsAndIsReadWritable(dir) if (!hasAccess) permissionUtil.value.handlePermissionFailed(null) return if (hasAccess) dir else defaultMusicDirectory diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/PermissionUtil.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/PermissionUtil.kt new file mode 100644 index 00000000..92813226 --- /dev/null +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/PermissionUtil.kt @@ -0,0 +1,259 @@ +package org.moire.ultrasonic.util + +import android.Manifest +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Handler +import android.os.Looper +import androidx.core.content.PermissionChecker +import com.karumi.dexter.Dexter +import com.karumi.dexter.MultiplePermissionsReport +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.multi.MultiplePermissionsListener +import org.moire.ultrasonic.R +import org.moire.ultrasonic.util.FileUtil.defaultMusicDirectory +import timber.log.Timber + +/** + * Contains static functions for Permission handling + */ +class PermissionUtil(private val applicationContext: Context) { + private var activityContext: Context? = null + + interface PermissionRequestFinishedCallback { + fun onPermissionRequestFinished(hasPermission: Boolean) + } + + fun onForegroundApplicationStarted(context: Context?) { + activityContext = context + } + + fun onForegroundApplicationStopped() { + activityContext = null + } + + /** + * This function can be used to handle file access permission failures. + * + * It will check if the failure is because the necessary permissions aren't available, + * and it will request them, if necessary. + * + * @param callback callback function to execute after the permission request is finished + */ + fun handlePermissionFailed(callback: PermissionRequestFinishedCallback?) { + val currentCachePath = Settings.cacheLocation + val defaultCachePath = defaultMusicDirectory.path + + // Ultrasonic can do nothing about this error when the Music Directory is already set to the default. + if (currentCachePath.compareTo(defaultCachePath) == 0) return + + if (PermissionChecker.checkSelfPermission( + applicationContext, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PermissionChecker.PERMISSION_DENIED || + PermissionChecker.checkSelfPermission( + applicationContext, + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PermissionChecker.PERMISSION_DENIED + ) { + // While we request permission, the Music Directory is temporarily reset to its default location + Settings.cacheLocation = defaultMusicDirectory.path + // If the application is not running, we can't notify the user + if (activityContext == null) return + requestFailedPermission(activityContext!!, currentCachePath, callback) + } else { + Settings.cacheLocation = defaultMusicDirectory.path + // If the application is not running, we can't notify the user + if (activityContext != null) { + Handler(Looper.getMainLooper()).post { + showWarning( + activityContext!!, + activityContext!!.getString(R.string.permissions_message_box_title), + activityContext!!.getString(R.string.permissions_access_error), + null + ) + } + } + callback?.onPermissionRequestFinished(false) + } + } + + companion object { + /** + * This function requests permission to access the filesystem. + * It can be used to request the permission initially, e.g. when the user decides to + * use a non-default folder for the cache + * @param context context for the operation + * @param callback callback function to execute after the permission request is finished + */ + @JvmStatic + fun requestInitialPermission( + context: Context, + callback: PermissionRequestFinishedCallback? + ) { + Dexter.withContext(context) + .withPermissions( + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + .withListener(object : MultiplePermissionsListener { + override fun onPermissionsChecked(report: MultiplePermissionsReport) { + if (report.areAllPermissionsGranted()) { + Timber.i("R/W permission granted for external storage") + callback?.onPermissionRequestFinished(true) + return + } + if (report.isAnyPermissionPermanentlyDenied) { + Timber.i( + "R/W permission is permanently denied for external storage" + ) + showSettingsDialog(context) + callback?.onPermissionRequestFinished(false) + return + } + Timber.i("R/W permission is missing for external storage") + showWarning( + context, + context.getString(R.string.permissions_message_box_title), + context.getString(R.string.permissions_rationale_description_initial), + null + ) + callback?.onPermissionRequestFinished(false) + } + + override fun onPermissionRationaleShouldBeShown( + permissions: List, + token: PermissionToken + ) { + showWarning( + context, + context.getString(R.string.permissions_rationale_title), + context.getString(R.string.permissions_rationale_description_initial), + token + ) + } + }).withErrorListener { error -> + Timber.e( + "An error has occurred during checking permissions with Dexter: %s", + error.toString() + ) + } + .check() + } + + private fun requestFailedPermission( + context: Context, + cacheLocation: String?, + callback: PermissionRequestFinishedCallback? + ) { + Dexter.withContext(context) + .withPermissions( + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + .withListener(object : MultiplePermissionsListener { + override fun onPermissionsChecked(report: MultiplePermissionsReport) { + if (report.areAllPermissionsGranted()) { + Timber.i("Permission granted to use cache directory %s", cacheLocation) + + if (cacheLocation != null) { + Settings.cacheLocation = cacheLocation + } + callback?.onPermissionRequestFinished(true) + return + } + if (report.isAnyPermissionPermanentlyDenied) { + Timber.i( + "R/W permission for cache directory %s was permanently denied", + cacheLocation + ) + showSettingsDialog(context) + callback?.onPermissionRequestFinished(false) + return + } + Timber.i( + "At least one permission is missing to use directory %s ", + cacheLocation + ) + Settings.cacheLocation = defaultMusicDirectory.path + showWarning( + context, context.getString(R.string.permissions_message_box_title), + context.getString(R.string.permissions_permission_missing), null + ) + callback?.onPermissionRequestFinished(false) + } + + override fun onPermissionRationaleShouldBeShown( + permissions: List, + token: PermissionToken + ) { + showWarning( + context, + context.getString(R.string.permissions_rationale_title), + context.getString(R.string.permissions_rationale_description_failed), + token + ) + } + }).withErrorListener { error -> + Timber.e( + "An error has occurred during checking permissions with Dexter: %s", + error.toString() + ) + } + .check() + } + + private fun showSettingsDialog(ctx: Context) { + + val builder = Util.createDialog( + context = ctx, + android.R.drawable.ic_dialog_alert, + ctx.getString(R.string.permissions_permanent_denial_title), + ctx.getString(R.string.permissions_permanent_denial_description) + ) + + builder.setPositiveButton(ctx.getString(R.string.permissions_open_settings)) { + dialog, _ -> + dialog.cancel() + openSettings(ctx) + } + + builder.setNegativeButton(ctx.getString(R.string.common_cancel)) { dialog, _ -> + Settings.cacheLocation = defaultMusicDirectory.path + dialog.cancel() + } + + builder.show() + } + + private fun openSettings(context: Context) { + val i = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + i.addCategory(Intent.CATEGORY_DEFAULT) + i.data = Uri.parse("package:" + context.packageName) + context.startActivity(i) + } + + private fun showWarning( + context: Context, + title: String, + text: String, + token: PermissionToken? + ) { + + val builder = Util.createDialog( + context = context, + android.R.drawable.ic_dialog_alert, + title, + text + ) + + builder.setPositiveButton(context.getString(R.string.common_ok)) { dialog, _ -> + dialog.cancel() + token?.continuePermissionRequest() + } + builder.show() + } + } +} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt index ed8d2847..baf64f56 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt @@ -102,6 +102,23 @@ object Settings { return if (preloadCount == -1) Int.MAX_VALUE else preloadCount } + @JvmStatic + var cacheLocation: String + get() { + return preferences.getString( + Constants.PREFERENCES_KEY_CACHE_LOCATION, + FileUtil.defaultMusicDirectory.path + )!! + } + set(location) { + val editor = preferences.edit() + editor.putString( + Constants.PREFERENCES_KEY_CACHE_LOCATION, + location + ) + editor.apply() + } + @JvmStatic val cacheSizeMB: Int get() { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt index 0336d393..3c5d2b91 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt @@ -393,17 +393,30 @@ object Util { // The AlertDialog requires an Activity context, app context is not enough // See https://stackoverflow.com/questions/5436822/ - fun showDialog(context: Context?, icon: Int, titleId: Int, message: String?) { - AlertDialog.Builder(context) + fun createDialog( + context: Context?, + icon: Int = android.R.drawable.ic_dialog_info, + title: String, + message: String? + ): AlertDialog.Builder { + return AlertDialog.Builder(context) .setIcon(icon) - .setTitle(titleId) + .setTitle(title) .setMessage(message) .setPositiveButton(R.string.common_ok) { dialog: DialogInterface, _: Int -> dialog.dismiss() } - .show() + } + + fun showDialog( + context: Context, + icon: Int = android.R.drawable.ic_dialog_info, + titleId: Int, + message: String? + ) { + createDialog(context, icon, context.getString(titleId, ""), message).show() } @JvmStatic From d7cd68c39e1463b57fa585fe3b93b76e07afade2 Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 12 Oct 2021 21:41:07 +0200 Subject: [PATCH 2/6] Makes more sense to update to 17 instead of 16. --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 0c1bf079..8c37e21b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,5 +1,5 @@ ext.versions = [ - minSdk : 16, + minSdk : 17, targetSdk : 29, compileSdk : 29, // You need to run ./gradlew wrapper after updating the version From d1e636f553131bb43a35ad3acd3ea483ada70d00 Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 12 Oct 2021 21:41:20 +0200 Subject: [PATCH 3/6] Fix some new lint issues --- ultrasonic/src/main/AndroidManifest.xml | 3 ++- .../src/main/res/xml/appwidget_info_4x1.xml | 16 +++++++++------- .../src/main/res/xml/appwidget_info_4x2.xml | 16 +++++++++------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ultrasonic/src/main/AndroidManifest.xml b/ultrasonic/src/main/AndroidManifest.xml index e80ca5f7..5ae6be6b 100644 --- a/ultrasonic/src/main/AndroidManifest.xml +++ b/ultrasonic/src/main/AndroidManifest.xml @@ -27,7 +27,8 @@ android:theme="@style/NoActionBar" android:name=".app.UApp" android:label="@string/common.appname" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:ignore="UnusedAttribute"> diff --git a/ultrasonic/src/main/res/xml/appwidget_info_4x1.xml b/ultrasonic/src/main/res/xml/appwidget_info_4x1.xml index 7993869d..df494cb8 100644 --- a/ultrasonic/src/main/res/xml/appwidget_info_4x1.xml +++ b/ultrasonic/src/main/res/xml/appwidget_info_4x1.xml @@ -1,9 +1,11 @@ \ No newline at end of file + xmlns:tools="http://schemas.android.com/tools" + a:minWidth="250dp" + a:minHeight="40dp" + a:updatePeriodMillis="0" + a:resizeMode="none" + a:previewImage="@drawable/preview4x1" + a:widgetCategory="home_screen|keyguard" + a:initialLayout="@layout/appwidget4x1" + tools:ignore="UnusedAttribute" /> \ No newline at end of file diff --git a/ultrasonic/src/main/res/xml/appwidget_info_4x2.xml b/ultrasonic/src/main/res/xml/appwidget_info_4x2.xml index 9f3a9078..be14efdc 100644 --- a/ultrasonic/src/main/res/xml/appwidget_info_4x2.xml +++ b/ultrasonic/src/main/res/xml/appwidget_info_4x2.xml @@ -1,9 +1,11 @@ \ No newline at end of file + xmlns:tools="http://schemas.android.com/tools" + a:minWidth="250dp" + a:minHeight="110dp" + a:updatePeriodMillis="0" + a:resizeMode="none" + a:previewImage="@drawable/preview4x2" + a:widgetCategory="home_screen|keyguard" + a:initialLayout="@layout/appwidget4x2" + tools:ignore="UnusedAttribute" /> \ No newline at end of file From fbdf6d846b613e5ea6e76f6daf55d37412f2b4b7 Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 12 Oct 2021 21:41:36 +0200 Subject: [PATCH 4/6] Cleanup dead code paths --- .../ultrasonic/fragment/SettingsFragment.java | 19 ------------------- .../ultrasonic/service/LocalMediaPlayer.kt | 6 +----- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java index 4be972db..fc5802ab 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java @@ -144,7 +144,6 @@ public class SettingsFragment extends PreferenceFragmentCompat setupServersCategory(); sharingDefaultGreeting.setText(Settings.getShareGreeting()); setupClearSearchPreference(); - setupGaplessControlSettingsV14(); setupFeatureFlagsPreferences(); setupCacheLocationPreference(); setupBluetoothDevicePreferences(); @@ -375,24 +374,6 @@ public class SettingsFragment extends PreferenceFragmentCompat } - private void setupGaplessControlSettingsV14() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - PreferenceCategory playbackControlSettings = - findPreference(Constants.PREFERENCES_KEY_PLAYBACK_CONTROL_SETTINGS); - CheckBoxPreference gaplessPlaybackEnabled = - findPreference(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK); - - if (gaplessPlaybackEnabled != null) { - gaplessPlaybackEnabled.setChecked(false); - gaplessPlaybackEnabled.setEnabled(false); - - if (playbackControlSettings != null) { - playbackControlSettings.removePreference(gaplessPlaybackEnabled); - } - } - } - } - private void setupServersCategory() { addServerPreference.setPersistent(false); addServerPreference.setTitle(getResources().getString(R.string.settings_server_manage_servers)); diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt index ef44886a..d30b5d00 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt @@ -485,11 +485,7 @@ class LocalMediaPlayer : KoinComponent { try { setNextPlayerState(PlayerState.PREPARED) if (Settings.gaplessPlayback && - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && - ( - playerState === PlayerState.STARTED || - playerState === PlayerState.PAUSED - ) + (playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED) ) { mediaPlayer.setNextMediaPlayer(nextMediaPlayer) nextSetup = true From 83f4ecb15a3324c923a31aec6aae59753e8c6da9 Mon Sep 17 00:00:00 2001 From: tzugen Date: Wed, 13 Oct 2021 08:31:34 +0200 Subject: [PATCH 5/6] Prepare a number of layouts for RTL and thereby fix a lot of lint messages --- ultrasonic/lint-baseline.xml | 2263 ++--------------- ultrasonic/src/main/AndroidManifest.xml | 1 + ultrasonic/src/main/res/drawable/thumb.xml | 4 +- .../main/res/layout-land/current_playing.xml | 4 +- .../src/main/res/layout/album_list_item.xml | 8 +- .../res/layout/album_list_item_legacy.xml | 12 +- .../src/main/res/layout/appwidget4x1.xml | 8 +- .../src/main/res/layout/appwidget4x2.xml | 12 +- .../src/main/res/layout/appwidget4x3.xml | 6 +- .../src/main/res/layout/appwidget4x4.xml | 6 +- .../src/main/res/layout/artist_list_item.xml | 12 +- ultrasonic/src/main/res/layout/chat_item.xml | 10 +- .../src/main/res/layout/chat_item_reverse.xml | 8 +- .../src/main/res/layout/current_playing.xml | 4 +- ultrasonic/src/main/res/layout/equalizer.xml | 4 +- .../src/main/res/layout/equalizer_bar.xml | 2 +- .../res/layout/filepicker_dialog_main.xml | 2 - .../layout/filepicker_item_file_lister.xml | 1 - .../res/layout/generic_text_list_item.xml | 4 +- .../src/main/res/layout/jukebox_volume.xml | 4 +- ultrasonic/src/main/res/layout/lyrics.xml | 12 +- .../src/main/res/layout/main_buttons.xml | 42 +- .../src/main/res/layout/media_buttons.xml | 4 +- .../src/main/res/layout/navigation_header.xml | 1 - .../src/main/res/layout/now_playing.xml | 10 +- .../src/main/res/layout/player_media_info.xml | 4 +- .../src/main/res/layout/player_slider.xml | 8 +- .../main/res/layout/playlist_list_item.xml | 4 +- .../src/main/res/layout/search_buttons.xml | 6 +- .../main/res/layout/select_album_header.xml | 26 +- .../main/res/layout/select_folder_header.xml | 6 +- .../src/main/res/layout/server_edit.xml | 10 - ultrasonic/src/main/res/layout/server_row.xml | 4 +- .../src/main/res/layout/share_list_item.xml | 6 +- .../src/main/res/layout/song_details.xml | 14 +- .../src/main/res/layout/song_list_item.xml | 8 +- .../src/main/res/layout/time_span_dialog.xml | 2 +- .../src/main/res/layout/update_playlist.xml | 12 +- .../src/main/res/layout/video_details.xml | 8 +- .../src/main/res/layout/video_list_item.xml | 4 +- ultrasonic/src/main/res/values/styles.xml | 2 +- 41 files changed, 300 insertions(+), 2268 deletions(-) diff --git a/ultrasonic/lint-baseline.xml b/ultrasonic/lint-baseline.xml index e9795cea..d4b7fda1 100644 --- a/ultrasonic/lint-baseline.xml +++ b/ultrasonic/lint-baseline.xml @@ -1,5 +1,5 @@ - + - - - - - - - - - - - - @@ -99,61 +66,6 @@ column="14"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -414,7 +172,7 @@ errorLine2=" ~~~~~~~~"> @@ -451,28 +209,6 @@ column="9"/> - - - - - - - - @@ -889,11 +625,11 @@ column="13"/> @@ -1202,11 +938,11 @@ column="13"/> @@ -1308,11 +1044,11 @@ column="13"/> @@ -1429,43 +1165,47 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - + + + + @@ -1509,18 +1249,7 @@ errorLine2=" ^"> - - - - @@ -1531,7 +1260,7 @@ errorLine2=" ^"> @@ -1542,7 +1271,7 @@ errorLine2=" ^"> @@ -1553,29 +1282,7 @@ errorLine2=" ^"> - - - - - - - - @@ -1586,7 +1293,7 @@ errorLine2=" ^"> @@ -1597,7 +1304,7 @@ errorLine2=" ^"> @@ -1705,7 +1412,7 @@ errorLine2=" ~~~~~~~~~"> @@ -1727,7 +1434,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1837,7 +1544,7 @@ errorLine2=" ~~~~~~~~~"> @@ -2277,7 +1984,7 @@ errorLine2=" ~~~~~~~~~"> @@ -2310,7 +2017,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2325,61 +2032,6 @@ column="6"/> - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -2415,7 +2122,7 @@ @@ -2633,1650 +2340,4 @@ column="6"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ultrasonic/src/main/AndroidManifest.xml b/ultrasonic/src/main/AndroidManifest.xml index 5ae6be6b..8b709fbd 100644 --- a/ultrasonic/src/main/AndroidManifest.xml +++ b/ultrasonic/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ android:name=".app.UApp" android:label="@string/common.appname" android:usesCleartextTraffic="true" + android:supportsRtl="false" tools:ignore="UnusedAttribute"> + android:paddingStart="22dp" + android:paddingEnd="22dp" /> diff --git a/ultrasonic/src/main/res/layout-land/current_playing.xml b/ultrasonic/src/main/res/layout-land/current_playing.xml index 2235bb65..a3028829 100644 --- a/ultrasonic/src/main/res/layout-land/current_playing.xml +++ b/ultrasonic/src/main/res/layout-land/current_playing.xml @@ -110,8 +110,8 @@ a:layout_width="fill_parent" a:layout_height="60dip" a:layout_gravity="bottom|center_horizontal" - a:layout_marginLeft="60dip" - a:layout_marginRight="60dip" + a:layout_marginStart="60dip" + a:layout_marginEnd="60dip" a:background="@color/translucent" a:orientation="vertical"/> diff --git a/ultrasonic/src/main/res/layout/album_list_item.xml b/ultrasonic/src/main/res/layout/album_list_item.xml index 5e66c129..e3e971d1 100644 --- a/ultrasonic/src/main/res/layout/album_list_item.xml +++ b/ultrasonic/src/main/res/layout/album_list_item.xml @@ -15,7 +15,6 @@ a:layout_height="64dp" a:layout_gravity="center_horizontal|center_vertical" a:layout_marginStart="6dp" - a:layout_marginLeft="6dp" a:layout_marginTop="6dp" a:scaleType="fitCenter" a:src="@drawable/unknown_album" @@ -28,13 +27,12 @@ a:layout_width="0dp" a:layout_height="74dp" a:layout_marginStart="10dp" - a:layout_marginLeft="10dp" a:drawablePadding="6dip" a:gravity="center_vertical" a:minHeight="56dip" a:orientation="vertical" - a:paddingLeft="3dip" - a:paddingRight="3dip" + a:paddingStart="3dip" + a:paddingEnd="3dip" a:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintEnd_toStartOf="@+id/album_star" app:layout_constraintLeft_toRightOf="@+id/album_coverart" @@ -65,10 +63,8 @@ a:layout_width="38dp" a:layout_height="38dp" a:layout_marginStart="16dp" - a:layout_marginLeft="16dp" a:layout_marginTop="16dp" a:layout_marginEnd="20dp" - a:layout_marginRight="20dp" a:background="@android:color/transparent" a:gravity="center_horizontal" a:src="?attr/star_hollow" diff --git a/ultrasonic/src/main/res/layout/album_list_item_legacy.xml b/ultrasonic/src/main/res/layout/album_list_item_legacy.xml index e4129ff1..f8e244a2 100644 --- a/ultrasonic/src/main/res/layout/album_list_item_legacy.xml +++ b/ultrasonic/src/main/res/layout/album_list_item_legacy.xml @@ -9,17 +9,17 @@ a:id="@+id/album_coverart" a:layout_width="64dp" a:layout_height="64dp" - a:layout_gravity="left|center_vertical" - a:paddingLeft="3dip" /> + a:layout_gravity="start|center_vertical" + a:paddingStart="3dip" /> + a:layout_gravity="start|center_vertical" + a:paddingStart="6dip" + a:paddingEnd="3dip"> + a:paddingEnd="3dip" /> diff --git a/ultrasonic/src/main/res/layout/appwidget4x1.xml b/ultrasonic/src/main/res/layout/appwidget4x1.xml index 8234544e..d46d1858 100644 --- a/ultrasonic/src/main/res/layout/appwidget4x1.xml +++ b/ultrasonic/src/main/res/layout/appwidget4x1.xml @@ -38,8 +38,8 @@ a:fadingEdge="horizontal" a:fadingEdgeLength="20dip" a:minHeight="16sp" - a:paddingLeft="4dip" - a:paddingRight="4dip" + a:paddingStart="4dip" + a:paddingEnd="4dip" a:paddingTop="4dip" a:singleLine="true" a:gravity="center_horizontal" @@ -57,8 +57,8 @@ a:fadingEdgeLength="10dip" a:minHeight="12sp" a:paddingBottom="4dip" - a:paddingLeft="4dip" - a:paddingRight="4dip" + a:paddingStart="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:gravity="center_horizontal" a:text="Artist" diff --git a/ultrasonic/src/main/res/layout/appwidget4x2.xml b/ultrasonic/src/main/res/layout/appwidget4x2.xml index dbee8569..51c4bcbf 100644 --- a/ultrasonic/src/main/res/layout/appwidget4x2.xml +++ b/ultrasonic/src/main/res/layout/appwidget4x2.xml @@ -40,8 +40,8 @@ a:fadingEdge="horizontal" a:fadingEdgeLength="20dip" a:minHeight="16sp" - a:paddingLeft="4dip" - a:paddingRight="4dip" + a:paddingStart="4dip" + a:paddingEnd="4dip" a:paddingTop="4dip" a:singleLine="true" a:gravity="center_horizontal" @@ -58,8 +58,8 @@ a:fadingEdge="horizontal" a:fadingEdgeLength="10dip" a:minHeight="12sp" - a:paddingLeft="4dip" - a:paddingRight="4dip" + a:paddingStart="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:gravity="center_horizontal" a:text="Artist" @@ -75,8 +75,8 @@ a:fadingEdgeLength="10dip" a:minHeight="12sp" a:paddingBottom="4dip" - a:paddingLeft="4dip" - a:paddingRight="4dip" + a:paddingStart="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:gravity="center_horizontal" a:text="Album" diff --git a/ultrasonic/src/main/res/layout/appwidget4x3.xml b/ultrasonic/src/main/res/layout/appwidget4x3.xml index 411dba03..ff103795 100644 --- a/ultrasonic/src/main/res/layout/appwidget4x3.xml +++ b/ultrasonic/src/main/res/layout/appwidget4x3.xml @@ -42,8 +42,8 @@ a:fadingEdge="horizontal" a:fadingEdgeLength="20dip" a:minHeight="16sp" - a:paddingLeft="5dip" - a:paddingRight="5dip" + a:paddingStart="5dip" + a:paddingEnd="5dip" a:singleLine="true" a:textColor="@color/appwidget_text" a:textSize="16sp" @@ -61,7 +61,7 @@ a:fadingEdgeLength="10dip" a:minHeight="12sp" a:paddingBottom="2dip" - a:paddingLeft="5dip" + a:paddingStart="5dip" a:singleLine="true" a:text="Artist" a:layout_gravity="center_horizontal" diff --git a/ultrasonic/src/main/res/layout/appwidget4x4.xml b/ultrasonic/src/main/res/layout/appwidget4x4.xml index b5aa402b..a7975b1d 100644 --- a/ultrasonic/src/main/res/layout/appwidget4x4.xml +++ b/ultrasonic/src/main/res/layout/appwidget4x4.xml @@ -43,8 +43,8 @@ a:fadingEdge="horizontal" a:fadingEdgeLength="20dip" a:minHeight="16sp" - a:paddingLeft="5dip" - a:paddingRight="5dip" + a:paddingStart="5dip" + a:paddingEnd="5dip" a:singleLine="true" a:textColor="@color/appwidget_text" a:textSize="16sp" @@ -62,7 +62,7 @@ a:fadingEdgeLength="10dip" a:minHeight="12sp" a:paddingBottom="2dip" - a:paddingLeft="5dip" + a:paddingStart="5dip" a:singleLine="true" a:text="Artist" a:layout_gravity="center_horizontal" diff --git a/ultrasonic/src/main/res/layout/artist_list_item.xml b/ultrasonic/src/main/res/layout/artist_list_item.xml index 26a4d7a1..527523c8 100644 --- a/ultrasonic/src/main/res/layout/artist_list_item.xml +++ b/ultrasonic/src/main/res/layout/artist_list_item.xml @@ -16,9 +16,7 @@ a:minWidth="56dip" a:minHeight="56dip" a:paddingStart="8dip" - a:paddingLeft="8dip" a:paddingEnd="8dip" - a:paddingRight="8dip" a:text="A" a:textAppearance="?android:attr/textAppearanceLarge" a:textColor="@color/cyan" /> @@ -30,11 +28,8 @@ a:layout_gravity="center_horizontal|center_vertical" a:layout_marginTop="8dp" a:layout_marginStart="2dp" - a:layout_marginLeft="2dp" a:layout_marginEnd="10dp" - a:layout_marginRight="10dp" a:layout_toEndOf="@+id/row_section" - a:layout_toRightOf="@+id/row_section" a:scaleType="fitCenter" a:src="@drawable/ic_contact_picture" app:shapeAppearanceOverlay="@style/roundedImageView" /> @@ -44,13 +39,12 @@ a:layout_width="fill_parent" a:layout_height="wrap_content" a:layout_toEndOf="@+id/artist_coverart" - a:layout_toRightOf="@+id/artist_coverart" a:drawablePadding="6dip" a:gravity="center_vertical" a:minHeight="56dip" - a:paddingLeft="3dip" - a:paddingRight="3dip" - a:layout_marginRight="12dp" + a:paddingStart="3dip" + a:paddingEnd="3dip" a:layout_marginEnd="12dp" + a:textAppearance="?android:attr/textAppearanceMedium" /> \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/chat_item.xml b/ultrasonic/src/main/res/layout/chat_item.xml index 3dad7870..8497995d 100644 --- a/ultrasonic/src/main/res/layout/chat_item.xml +++ b/ultrasonic/src/main/res/layout/chat_item.xml @@ -20,8 +20,8 @@ a:id="@+id/chat_username" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_marginLeft="6dip" - a:layout_marginRight="6dip" + a:layout_marginStart="6dip" + a:layout_marginEnd="6dip" a:ellipsize="marquee" a:singleLine="true" a:textIsSelectable="true" @@ -43,7 +43,7 @@ a:id="@+id/chat_time" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_marginLeft="6dip" + a:layout_marginStart="6dip" a:singleLine="true" a:textIsSelectable="true" a:textAppearance="?android:attr/textAppearanceMedium" @@ -53,8 +53,8 @@ a:id="@+id/chat_message" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_marginLeft="6dip" - a:layout_marginRight="6dip" + a:layout_marginStart="6dip" + a:layout_marginEnd="6dip" a:textIsSelectable="true" a:linksClickable="true" a:singleLine="false" diff --git a/ultrasonic/src/main/res/layout/chat_item_reverse.xml b/ultrasonic/src/main/res/layout/chat_item_reverse.xml index 39ca0b0f..a7684a43 100644 --- a/ultrasonic/src/main/res/layout/chat_item_reverse.xml +++ b/ultrasonic/src/main/res/layout/chat_item_reverse.xml @@ -17,7 +17,7 @@ a:id="@+id/chat_username" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_marginRight="6dip" + a:layout_marginEnd="6dip" a:gravity="center_vertical|right" a:layout_gravity="right" a:ellipsize="marquee" @@ -38,7 +38,7 @@ a:id="@+id/chat_time" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_marginLeft="6dip" + a:layout_marginStart="6dip" a:singleLine="true" a:gravity="center_vertical|right" a:textIsSelectable="true" @@ -49,8 +49,8 @@ a:id="@+id/chat_message" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_marginLeft="6dip" - a:layout_marginRight="6dip" + a:layout_marginStart="6dip" + a:layout_marginEnd="6dip" a:linksClickable="true" a:singleLine="false" a:autoLink="all" diff --git a/ultrasonic/src/main/res/layout/current_playing.xml b/ultrasonic/src/main/res/layout/current_playing.xml index 43c5d843..806ceb04 100644 --- a/ultrasonic/src/main/res/layout/current_playing.xml +++ b/ultrasonic/src/main/res/layout/current_playing.xml @@ -110,8 +110,8 @@ a:layout_height="60dip" a:layout_gravity="center" a:background="@color/translucent" - a:layout_marginLeft="80dip" - a:layout_marginRight="80dip" + a:layout_marginStart="80dip" + a:layout_marginEnd="80dip" a:orientation="vertical" /> diff --git a/ultrasonic/src/main/res/layout/equalizer.xml b/ultrasonic/src/main/res/layout/equalizer.xml index a1f3ecba..63aea6d2 100644 --- a/ultrasonic/src/main/res/layout/equalizer.xml +++ b/ultrasonic/src/main/res/layout/equalizer.xml @@ -36,8 +36,8 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="20dip" - android:paddingLeft="40dip" - android:paddingRight="40dip"/> + android:paddingStart="40dip" + android:paddingEnd="40dip"/> diff --git a/ultrasonic/src/main/res/layout/equalizer_bar.xml b/ultrasonic/src/main/res/layout/equalizer_bar.xml index 6b75b623..b76d8e75 100644 --- a/ultrasonic/src/main/res/layout/equalizer_bar.xml +++ b/ultrasonic/src/main/res/layout/equalizer_bar.xml @@ -24,7 +24,7 @@ a:layout_height="wrap_content" a:layout_marginTop="8dp" a:layout_alignParentRight="true" - a:layout_toRightOf="@+id/equalizer.frequency" + a:layout_toEndOf="@+id/equalizer.frequency" /> diff --git a/ultrasonic/src/main/res/layout/generic_text_list_item.xml b/ultrasonic/src/main/res/layout/generic_text_list_item.xml index 05b31407..560f794a 100644 --- a/ultrasonic/src/main/res/layout/generic_text_list_item.xml +++ b/ultrasonic/src/main/res/layout/generic_text_list_item.xml @@ -6,6 +6,6 @@ a:layout_height="wrap_content" a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical" - a:paddingLeft="3dip" - a:paddingRight="3dip" + a:paddingStart="3dip" + a:paddingEnd="3dip" a:minHeight="50dip"/> \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/jukebox_volume.xml b/ultrasonic/src/main/res/layout/jukebox_volume.xml index 6e00ed96..81adf6ad 100644 --- a/ultrasonic/src/main/res/layout/jukebox_volume.xml +++ b/ultrasonic/src/main/res/layout/jukebox_volume.xml @@ -14,8 +14,8 @@ a:textColor="#ffffffff" a:shadowColor="#bb000000" a:shadowRadius="2.75" - a:paddingLeft="32dp" - a:paddingRight="32dp" + a:paddingStart="32dp" + a:paddingEnd="32dp" a:paddingBottom="12dp" /> diff --git a/ultrasonic/src/main/res/layout/lyrics.xml b/ultrasonic/src/main/res/layout/lyrics.xml index 6880d374..0495dd9c 100644 --- a/ultrasonic/src/main/res/layout/lyrics.xml +++ b/ultrasonic/src/main/res/layout/lyrics.xml @@ -28,8 +28,8 @@ a:gravity="center_horizontal" a:layout_width="fill_parent" a:layout_height="wrap_content" - a:paddingLeft="10dip" - a:paddingRight="10dip" + a:paddingStart="10dip" + a:paddingEnd="10dip" a:paddingTop="10dip" a:paddingBottom="4dip" /> @@ -40,8 +40,8 @@ a:gravity="center_horizontal" a:layout_width="fill_parent" a:layout_height="wrap_content" - a:paddingLeft="10dip" - a:paddingRight="10dip" + a:paddingStart="10dip" + a:paddingEnd="10dip" /> diff --git a/ultrasonic/src/main/res/layout/main_buttons.xml b/ultrasonic/src/main/res/layout/main_buttons.xml index cbdd8ca6..d5be2f11 100644 --- a/ultrasonic/src/main/res/layout/main_buttons.xml +++ b/ultrasonic/src/main/res/layout/main_buttons.xml @@ -4,7 +4,7 @@ @@ -28,7 +28,7 @@ a:id="@+id/main.select_server_2" a:layout_width="fill_parent" a:layout_height="wrap_content" - a:layout_marginLeft="10dip" + a:layout_marginStart="10dip" a:textAppearance="?android:attr/textAppearanceSmall" /> @@ -37,95 +37,95 @@ + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> + a:paddingStart="6dip" a:paddingEnd="6dip" a:minHeight="40dip" /> diff --git a/ultrasonic/src/main/res/layout/media_buttons.xml b/ultrasonic/src/main/res/layout/media_buttons.xml index 92f02e91..a9eef057 100644 --- a/ultrasonic/src/main/res/layout/media_buttons.xml +++ b/ultrasonic/src/main/res/layout/media_buttons.xml @@ -4,8 +4,8 @@ a:layout_width="fill_parent" a:layout_height="wrap_content" a:orientation="horizontal" - a:layout_marginLeft="12dp" - a:layout_marginRight="12dp" > + a:layout_marginStart="12dp" + a:layout_marginEnd="12dp" > diff --git a/ultrasonic/src/main/res/layout/now_playing.xml b/ultrasonic/src/main/res/layout/now_playing.xml index ebbd4d65..5cf76272 100644 --- a/ultrasonic/src/main/res/layout/now_playing.xml +++ b/ultrasonic/src/main/res/layout/now_playing.xml @@ -19,7 +19,6 @@ android:id="@+id/now_playing_image" android:layout_width="64.0dip" android:layout_height="64.0dip" - android:layout_marginLeft="6dp" android:focusable="true" android:gravity="center" android:layout_marginStart="6dp" /> @@ -30,14 +29,13 @@ android:layout_gravity="center_vertical" android:layout_weight="1.0" android:orientation="vertical" - android:paddingLeft="11.0dip" android:paddingStart="11.0dip"> + a:layout_marginStart="12dp" + a:layout_marginEnd="12dp" > + a:layout_marginStart="12dp" + a:layout_marginEnd="12dp" > @@ -31,7 +31,7 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_alignParentRight="true" - a:layout_marginRight="12dip" + a:layout_marginEnd="12dip" a:text="@string/util.no_time" a:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/ultrasonic/src/main/res/layout/playlist_list_item.xml b/ultrasonic/src/main/res/layout/playlist_list_item.xml index 3bcc8489..410837ad 100644 --- a/ultrasonic/src/main/res/layout/playlist_list_item.xml +++ b/ultrasonic/src/main/res/layout/playlist_list_item.xml @@ -11,8 +11,8 @@ android:layout_weight="1" android:textAppearance="?android:attr/textAppearanceMedium" android:gravity="left|center_vertical" - android:paddingLeft="6dip" - android:paddingRight="6dip" + android:paddingStart="6dip" + android:paddingEnd="6dip" android:minHeight="50dip"/> \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/search_buttons.xml b/ultrasonic/src/main/res/layout/search_buttons.xml index 89742b70..66b82755 100644 --- a/ultrasonic/src/main/res/layout/search_buttons.xml +++ b/ultrasonic/src/main/res/layout/search_buttons.xml @@ -24,7 +24,7 @@ a:textStyle="bold" a:background="#ff555555" a:gravity="center_vertical" - a:paddingLeft="4dp"/> + a:paddingStart="4dp"/> + a:paddingStart="4dp"/> + a:paddingStart="4dp"/> @@ -18,9 +18,9 @@ a:id="@+id/select_album_title" a:layout_width="wrap_content" a:layout_height="wrap_content" - a:layout_toRightOf="@+id/select_album_art" + a:layout_toEndOf="@+id/select_album_art" a:ellipsize="end" - a:paddingRight="4dip" + a:paddingEnd="4dip" a:paddingTop="10dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceMedium"/> @@ -30,9 +30,9 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_below="@+id/select_album_title" - a:layout_toRightOf="@+id/select_album_art" + a:layout_toEndOf="@+id/select_album_art" a:ellipsize="end" - a:paddingRight="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> @@ -41,9 +41,9 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_below="@+id/select_album_artist" - a:layout_toRightOf="@+id/select_album_art" + a:layout_toEndOf="@+id/select_album_art" a:ellipsize="end" - a:paddingRight="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> @@ -52,9 +52,9 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_below="@+id/select_album_genre" - a:layout_toRightOf="@+id/select_album_art" + a:layout_toEndOf="@+id/select_album_art" a:ellipsize="end" - a:paddingRight="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> @@ -63,9 +63,9 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_below="@+id/select_album_year" - a:layout_toRightOf="@+id/select_album_art" + a:layout_toEndOf="@+id/select_album_art" a:ellipsize="none" - a:paddingRight="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> @@ -74,9 +74,9 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_below="@+id/select_album_song_count" - a:layout_toRightOf="@+id/select_album_art" + a:layout_toEndOf="@+id/select_album_art" a:ellipsize="none" - a:paddingRight="4dip" + a:paddingEnd="4dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> diff --git a/ultrasonic/src/main/res/layout/select_folder_header.xml b/ultrasonic/src/main/res/layout/select_folder_header.xml index 68538369..6eefae31 100644 --- a/ultrasonic/src/main/res/layout/select_folder_header.xml +++ b/ultrasonic/src/main/res/layout/select_folder_header.xml @@ -6,7 +6,7 @@ a:minHeight="?android:attr/listPreferredItemHeight" a:orientation="horizontal" a:paddingBottom="2dip" - a:paddingLeft="6dp" + a:paddingStart="6dp" a:paddingTop="2dip" a:background="?android:attr/selectableItemBackground" a:clickable="true" @@ -27,7 +27,7 @@ a:id="@+id/select_folder_title" a:layout_width="fill_parent" a:layout_height="wrap_content" - a:layout_marginLeft="10dip" + a:layout_marginStart="10dip" a:layout_marginTop="6dip" a:text="@string/select_artist.folder" a:textAppearance="?android:attr/textAppearanceLarge" /> @@ -36,7 +36,7 @@ a:id="@+id/select_folder_name" a:layout_width="fill_parent" a:layout_height="wrap_content" - a:layout_marginLeft="10dip" + a:layout_marginStart="10dip" a:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/ultrasonic/src/main/res/layout/server_edit.xml b/ultrasonic/src/main/res/layout/server_edit.xml index 1058c3f6..a90ae7f3 100644 --- a/ultrasonic/src/main/res/layout/server_edit.xml +++ b/ultrasonic/src/main/res/layout/server_edit.xml @@ -110,7 +110,6 @@ a:layout_width="0dp" a:layout_height="wrap_content" a:layout_marginStart="5dp" - a:layout_marginLeft="5dp" a:text="@string/settings.title.allow_self_signed_certificate" app:layout_constraintBottom_toTopOf="@id/edit_ldap_title" app:layout_constraintStart_toStartOf="parent" @@ -121,9 +120,7 @@ a:layout_width="0dp" a:layout_height="wrap_content" a:layout_marginStart="8dp" - a:layout_marginLeft="8dp" a:layout_marginEnd="5dp" - a:layout_marginRight="5dp" a:layout_marginBottom="8dp" a:checked="false" app:layout_constraintBottom_toTopOf="@id/edit_ldap_title" @@ -137,7 +134,6 @@ a:layout_width="0dp" a:layout_height="wrap_content" a:layout_marginStart="5dp" - a:layout_marginLeft="5dp" a:text="@string/settings.title.enable_ldap_users_support" app:layout_constraintBottom_toTopOf="@id/edit_ldap_description" app:layout_constraintStart_toStartOf="parent" @@ -149,7 +145,6 @@ a:layout_width="0dp" a:layout_height="wrap_content" a:layout_marginStart="5dp" - a:layout_marginLeft="5dp" a:text="@string/settings.summary.enable_ldap_users_support" app:layout_constraintBottom_toTopOf="@id/edit_jukebox" app:layout_constraintEnd_toStartOf="@id/edit_ldap" @@ -161,8 +156,6 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_marginEnd="5dp" - a:layout_marginRight="5dp" - a:layout_marginLeft="8dp" a:layout_marginStart="8dp" a:checked="false" app:layout_constraintBottom_toBottomOf="@id/edit_ldap_description" @@ -176,7 +169,6 @@ a:layout_width="0dp" a:layout_height="wrap_content" a:layout_marginStart="5dp" - a:layout_marginLeft="5dp" a:layout_marginTop="8dp" a:text="@string/jukebox.is_default" app:layout_constraintStart_toStartOf="parent" @@ -187,10 +179,8 @@ a:layout_width="0dp" a:layout_height="wrap_content" a:layout_marginStart="8dp" - a:layout_marginLeft="8dp" a:layout_marginTop="8dp" a:layout_marginEnd="5dp" - a:layout_marginRight="5dp" a:checked="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/edit_jukebox_title" diff --git a/ultrasonic/src/main/res/layout/server_row.xml b/ultrasonic/src/main/res/layout/server_row.xml index 0a4c1ed5..fc4643e2 100644 --- a/ultrasonic/src/main/res/layout/server_row.xml +++ b/ultrasonic/src/main/res/layout/server_row.xml @@ -21,7 +21,6 @@ a:layout_height="wrap_content" a:textAppearance="?android:attr/textAppearanceListItem" a:paddingTop="10dp" - a:layout_toRightOf="@id/server_image" a:layout_toEndOf="@id/server_image" /> diff --git a/ultrasonic/src/main/res/layout/share_list_item.xml b/ultrasonic/src/main/res/layout/share_list_item.xml index a1580129..f72ba4df 100644 --- a/ultrasonic/src/main/res/layout/share_list_item.xml +++ b/ultrasonic/src/main/res/layout/share_list_item.xml @@ -4,8 +4,8 @@ a:layout_height="wrap_content" a:layout_gravity="center_vertical" a:layout_weight="1" - a:paddingLeft="6dip" - a:paddingRight="6dip" + a:paddingStart="6dip" + a:paddingEnd="6dip" a:minHeight="44dip" a:orientation="vertical"> @@ -38,7 +38,7 @@ a:layout_gravity="left|center_vertical" a:layout_weight="1" a:ellipsize="middle" - a:paddingLeft="4dip" + a:paddingStart="4dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> diff --git a/ultrasonic/src/main/res/layout/song_details.xml b/ultrasonic/src/main/res/layout/song_details.xml index c2ed8e16..7cab9d5f 100644 --- a/ultrasonic/src/main/res/layout/song_details.xml +++ b/ultrasonic/src/main/res/layout/song_details.xml @@ -4,7 +4,7 @@ a:layout_height="wrap_content" a:layout_gravity="center_vertical" a:layout_weight="1" - a:layout_marginLeft="4dp" + a:layout_marginStart="4dp" a:orientation="vertical"> @@ -39,7 +39,7 @@ a:layout_height="wrap_content" a:layout_gravity="right|center_vertical" a:drawablePadding="6dip" - a:paddingRight="6dip"/> + a:paddingEnd="6dip"/> @@ -64,8 +64,8 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_gravity="right|center_vertical" - a:paddingLeft="3dip" - a:paddingRight="9dip" + a:paddingStart="3dip" + a:paddingEnd="9dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> diff --git a/ultrasonic/src/main/res/layout/song_list_item.xml b/ultrasonic/src/main/res/layout/song_list_item.xml index 53c33ccf..ad7a325a 100644 --- a/ultrasonic/src/main/res/layout/song_list_item.xml +++ b/ultrasonic/src/main/res/layout/song_list_item.xml @@ -11,9 +11,7 @@ a:id="@+id/song_drag" a:layout_width="wrap_content" a:layout_height="fill_parent" - a:paddingLeft="5dip" a:paddingStart="5dip" - a:paddingRight="0dip" a:paddingEnd="0dip" a:background="@android:color/transparent" a:focusable="false" @@ -26,7 +24,7 @@ a:layout_height="fill_parent" a:checkMark="?attr/button_check_custom" a:gravity="center_vertical" - a:paddingRight="4dip"/> + a:paddingEnd="4dip"/> @@ -82,7 +80,7 @@ a:id="@+id/song_five_star_5" a:layout_width="10dip" a:layout_height="fill_parent" - a:layout_marginRight="8dip" + a:layout_marginEnd="8dip" a:background="@android:color/transparent" a:focusable="false" a:gravity="center_vertical" @@ -98,7 +96,7 @@ a:background="@android:color/transparent" a:focusable="false" a:gravity="center_vertical" - a:paddingRight="8dip" + a:paddingEnd="8dip" a:src="?attr/star_hollow" /> \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/time_span_dialog.xml b/ultrasonic/src/main/res/layout/time_span_dialog.xml index 30b9be60..920a87b6 100644 --- a/ultrasonic/src/main/res/layout/time_span_dialog.xml +++ b/ultrasonic/src/main/res/layout/time_span_dialog.xml @@ -44,7 +44,7 @@ android:layout_height="wrap_content" android:id="@+id/timeSpanSpinner" android:layout_alignBottom="@+id/timeSpanEditText" - android:layout_toRightOf="@+id/timeSpanEditText"/> + android:layout_toEndOf="@+id/timeSpanEditText"/> \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/update_playlist.xml b/ultrasonic/src/main/res/layout/update_playlist.xml index 57664f99..cc33e81e 100644 --- a/ultrasonic/src/main/res/layout/update_playlist.xml +++ b/ultrasonic/src/main/res/layout/update_playlist.xml @@ -12,7 +12,7 @@ android:id="@+id/get_playlist_name_label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="4dp" + android:layout_marginStart="4dp" android:textSize="20sp" android:text="@string/common.name" /> @@ -34,7 +34,7 @@ android:id="@+id/get_playlist_comment_label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="4dp" + android:layout_marginStart="4dp" android:textSize="20sp" android:text="@string/common.comment" /> @@ -56,7 +56,7 @@ android:id="@+id/get_playlist_public_label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="4dp" + android:layout_marginStart="4dp" android:textSize="20sp" android:text="@string/common.public" /> \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/video_details.xml b/ultrasonic/src/main/res/layout/video_details.xml index 08ac014e..2ea9473c 100644 --- a/ultrasonic/src/main/res/layout/video_details.xml +++ b/ultrasonic/src/main/res/layout/video_details.xml @@ -19,8 +19,8 @@ a:layout_gravity="left|center_vertical" a:layout_weight="1" a:ellipsize="end" - a:paddingLeft="4dip" - a:paddingRight="2dip" + a:paddingStart="4dip" + a:paddingEnd="2dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceMedium"/> @@ -29,8 +29,8 @@ a:layout_width="wrap_content" a:layout_height="wrap_content" a:layout_gravity="right|center_vertical" - a:paddingLeft="2dip" - a:paddingRight="6dip" + a:paddingStart="2dip" + a:paddingEnd="6dip" a:singleLine="true" a:textAppearance="?android:attr/textAppearanceSmall"/> diff --git a/ultrasonic/src/main/res/layout/video_list_item.xml b/ultrasonic/src/main/res/layout/video_list_item.xml index 0066fb2d..5851bbca 100644 --- a/ultrasonic/src/main/res/layout/video_list_item.xml +++ b/ultrasonic/src/main/res/layout/video_list_item.xml @@ -10,7 +10,7 @@ a:layout_width="wrap_content" a:layout_height="fill_parent" a:gravity="center_vertical" - a:paddingLeft="1dip" + a:paddingStart="1dip" a:visibility="gone" /> \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/styles.xml b/ultrasonic/src/main/res/values/styles.xml index d3f040f1..b90b338a 100644 --- a/ultrasonic/src/main/res/values/styles.xml +++ b/ultrasonic/src/main/res/values/styles.xml @@ -15,7 +15,7 @@ 14sp true center_vertical - 16dp + 16dp true end From 16b2a99631c9f4ed0c3068c98acfa8196c72c10b Mon Sep 17 00:00:00 2001 From: Nite Date: Thu, 14 Oct 2021 20:26:21 +0200 Subject: [PATCH 6/6] Fixed lint errors --- ultrasonic/src/main/res/values-cs/strings.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ultrasonic/src/main/res/values-cs/strings.xml b/ultrasonic/src/main/res/values-cs/strings.xml index 6975144b..6c614aee 100644 --- a/ultrasonic/src/main/res/values-cs/strings.xml +++ b/ultrasonic/src/main/res/values-cs/strings.xml @@ -420,43 +420,36 @@ %d skladba %d skladby - %d skladeb %d skladeb %d skladba vybrána pro připnutí. %d skladby vybrány pro připnutí. - %d skladeb vybráno pro připnutí. %d skladeb vybráno pro připnutí. %d skladba vybrána pro stažení. %d skladby vybrány pro stažení. - %d skladeb vybráno pro stažení. %d skladeb vybráno pro stažení. %d skladba vybrána pro odepnutí. %d skladby vybrány pro odepnutí. - %d skladeb vybráno pro odepnutí. %d skladeb vybráno pro odepnutí. %d skladba přidána na konec fronty přehrávání. %d skladyb přidány na konec fronty přehrávání. - %d skladeb přidáno na konec fronty přehrávání. %d skladeb přidáno na konec fronty přehrávání. %d skladba přidána za aktuální skladbu. %d skladby přidány za aktuální skladbu. - %d skladeb přidáno za aktuální skladbu. %d skladeb přidáno za aktuální skladbu. Zbývá %d den zkušební doby Zbývají %d dny zkušební doby - Zbývá %d dní zkušební doby Zbývá %d dní zkušební doby