Drop support for KitKat

* KitKat represents 1.3% of total userbase but...
* KitKat users running recent app version represent about 0.02% of DAU
* dav4jvm 2.x requires Android 5+
pull/996/head
Alex Baker 4 years ago
parent 3eb2e86ed8
commit c67f59d892

@ -40,7 +40,6 @@ android {
versionName = "8.11"
targetSdkVersion(Versions.targetSdk)
minSdkVersion(Versions.minSdk)
multiDexEnabled = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
kapt {
@ -160,7 +159,6 @@ dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}")
implementation("io.github.luizgrp.sectionedrecyclerviewadapter:sectionedrecyclerviewadapter:2.0.0")
implementation("androidx.multidex:multidex:2.0.1")
implementation("com.squareup.okhttp3:okhttp:${Versions.okhttp}")
implementation("com.google.code.gson:gson:2.8.6")
implementation("com.google.android.material:material:1.1.0")

@ -419,11 +419,6 @@
licenseUrl: http://www.opensource.org/licenses/mit-license.php
url: https://github.com/mapbox/mapbox-java
forceGenerate: true
- artifact: androidx.multidex:multidex:+
name: Android Multi-Dex Library
copyrightHolder: Android Open Source Project
license: The Apache Software License, Version 2.0
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
- artifact: com.mapbox.mapboxsdk:mapbox-android-gestures:+
name: Mapbox Android Gestures Library
copyrightHolder: Mapbox

@ -972,19 +972,6 @@
"url": "https://github.com/mapbox/mapbox-java",
"libraryName": "Mapbox services-core"
},
{
"artifactId": {
"name": "multidex",
"group": "androidx.multidex",
"version": "+"
},
"copyrightHolder": "Android Open Source Project",
"copyrightStatement": "Copyright © Android Open Source Project. All rights reserved.",
"license": "The Apache Software License, Version 2.0",
"licenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt",
"normalizedLicense": "apache2",
"libraryName": "Android Multi-Dex Library"
},
{
"artifactId": {
"name": "mapbox-android-gestures",

@ -134,10 +134,6 @@ public class AndroidUtilities {
return (int) (dp * displayMetrics.density + 0.5f);
}
public static boolean preLollipop() {
return !atLeastLollipop();
}
public static boolean preMarshmallow() {
return !atLeastMarshmallow();
}
@ -146,10 +142,6 @@ public class AndroidUtilities {
return !atLeastOreo();
}
public static boolean atLeastLollipop() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
}
public static boolean atLeastMarshmallow() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}

@ -8,7 +8,6 @@ package com.todoroo.astrid.activity;
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastNougat;
import static com.todoroo.astrid.activity.TaskEditFragment.newTaskEditFragment;
import static com.todoroo.astrid.activity.TaskListFragment.newTaskListFragment;
@ -528,9 +527,7 @@ public class MainActivity extends InjectingAppCompatActivity
public void onSupportActionModeFinished(@NonNull ActionMode mode) {
super.onSupportActionModeFinished(mode);
if (atLeastLollipop()) {
getWindow().setStatusBarColor(0);
}
getWindow().setStatusBarColor(0);
}
private void finishActionMode() {

@ -1,8 +1,5 @@
package com.todoroo.astrid.adapter;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import androidx.annotation.RequiresApi;
import com.todoroo.astrid.dao.TaskDao;
import org.tasks.data.CaldavDao;
import org.tasks.data.CaldavTask;
@ -10,7 +7,6 @@ import org.tasks.data.SubsetCaldav;
import org.tasks.data.TaskContainer;
import org.tasks.tasklist.ViewHolder;
@RequiresApi(api = LOLLIPOP)
public final class CaldavTaskAdapter extends TaskAdapter {
private final TaskDao taskDao;

@ -1,10 +1,6 @@
package com.todoroo.astrid.adapter;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
import android.app.Activity;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.ImageView;
@ -12,7 +8,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
@ -79,21 +74,6 @@ public class FilterViewHolder extends RecyclerView.ViewHolder {
if (navigationDrawer) {
text.setCheckMarkDrawable(null);
} else if (preLollipop()) {
ColorStateList tintList =
new ColorStateList(
new int[][] {
new int[] {-android.R.attr.state_checked}, new int[] {android.R.attr.state_checked}
},
new int[] {
ResourcesCompat.getColor(
activity.getResources(), android.R.color.transparent, null),
accent.getAccentColor()
});
Drawable original = ContextCompat.getDrawable(activity, R.drawable.ic_outline_done_24px);
Drawable wrapped = DrawableCompat.wrap(original.mutate());
DrawableCompat.setTintList(wrapped, tintList);
text.setCheckMarkDrawable(wrapped);
}
}

@ -1,7 +1,5 @@
package com.todoroo.astrid.adapter;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import android.content.Context;
import android.text.TextUtils;
import com.todoroo.astrid.api.CaldavFilter;
@ -79,7 +77,7 @@ public class TaskAdapterProvider {
CaldavFilter caldavFilter = (CaldavFilter) filter;
CaldavCalendar calendar = caldavDao.getCalendarByUuid(caldavFilter.getUuid());
if (calendar != null) {
return atLeastLollipop() ? new CaldavTaskAdapter(taskDao, caldavDao) : new TaskAdapter();
return new CaldavTaskAdapter(taskDao, caldavDao);
}
} else {
return subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)

@ -11,7 +11,6 @@ import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import static com.todoroo.andlib.sql.SqlConstants.COUNT;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.DateUtilities.now;
import static org.tasks.db.DbUtils.batch;
@ -144,8 +143,8 @@ public abstract class TaskDao {
@Transaction
public List<TaskContainer> fetchTasks(QueryCallback callback) {
long start = BuildConfig.DEBUG ? now() : 0;
boolean includeGoogleSubtasks = atLeastLollipop() && hasGoogleTaskSubtasks();
boolean includeCaldavSubtasks = atLeastLollipop() && hasSubtasks();
boolean includeGoogleSubtasks = hasGoogleTaskSubtasks();
boolean includeCaldavSubtasks = hasSubtasks();
List<String> queries = callback.getQueries(includeGoogleSubtasks, includeCaldavSubtasks);
SupportSQLiteDatabase db = database.getOpenHelper().getWritableDatabase();
int last = queries.size() - 1;
@ -220,12 +219,6 @@ public abstract class TaskDao {
return getChildren(Collections.singletonList(id));
}
public List<Long> getChildren(List<Long> ids) {
return atLeastLollipop()
? getChildrenRecursive(ids)
: Collections.emptyList();
}
@Query(
"WITH RECURSIVE "
+ " recursive_tasks (task) AS ( "
@ -239,7 +232,7 @@ public abstract class TaskDao {
+ " ON recursive_tasks.task = tasks.parent"
+ " WHERE tasks.deleted = 0)"
+ "SELECT task FROM recursive_tasks")
abstract List<Long> getChildrenRecursive(List<Long> ids);
public abstract List<Long> getChildren(List<Long> ids);
public List<Long> findChildrenInList(List<Long> ids) {
List<Long> result = newArrayList(ids);

@ -1,12 +1,8 @@
package org.tasks.activities;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
@ -14,7 +10,6 @@ import androidx.core.content.FileProvider;
import com.todoroo.astrid.utility.Constants;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.inject.Inject;
import org.tasks.files.FileHelper;
import org.tasks.injection.ActivityComponent;
@ -57,17 +52,7 @@ public class CameraActivity extends InjectingAppCompatActivity {
FileProvider.getUriForFile(
this, Constants.FILE_PROVIDER_AUTHORITY, new File(uri.getPath()));
intent.putExtra(MediaStore.EXTRA_OUTPUT, shared);
if (atLeastLollipop()) {
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
List<ResolveInfo> resolveInfoList =
getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resolveInfoList) {
grantUriPermission(
resolveInfo.activityInfo.packageName, shared, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
}

@ -35,13 +35,7 @@ public class DialogBuilder {
}
ProgressDialog newProgressDialog() {
ProgressDialog progressDialog = new ProgressDialog(activity);
if (AndroidUtilities.preLollipop()) {
ColorDrawable background =
new ColorDrawable(activity.getResources().getColor(android.R.color.transparent));
progressDialog.getWindow().setBackgroundDrawable(background);
}
return progressDialog;
return new ProgressDialog(activity);
}
public ProgressDialog newProgressDialog(int messageId) {

@ -1,12 +1,9 @@
package org.tasks.dialogs;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@ -113,11 +110,7 @@ public class SortDialog extends InjectingDialogFragment {
private void enableReverse() {
if (manualEnabled) {
Button reverse = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
if (atLeastLollipop()) {
reverse.setEnabled(selectedIndex != 0);
} else {
reverse.setVisibility(selectedIndex == 0 ? View.GONE : View.VISIBLE);
}
reverse.setEnabled(selectedIndex != 0);
}
}

@ -4,8 +4,6 @@ import static android.content.ContentResolver.SCHEME_CONTENT;
import static android.provider.DocumentsContract.EXTRA_INITIAL_URI;
import static androidx.core.content.FileProvider.getUriForFile;
import static com.google.common.collect.Iterables.any;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
import static com.todoroo.astrid.utility.Constants.FILE_PROVIDER_AUTHORITY;
import android.annotation.TargetApi;
@ -14,7 +12,6 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
@ -60,24 +57,22 @@ public class FileHelper {
}
public static void newDirectoryPicker(Fragment fragment, int rc, @Nullable Uri initial) {
if (atLeastLollipop()) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
intent.putExtra("android.content.extra.FANCY", true);
intent.putExtra("android.content.extra.SHOW_FILESIZE", true);
setInitialUri(fragment.getContext(), intent, initial);
fragment.startActivityForResult(intent, rc);
}
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
intent.putExtra("android.content.extra.FANCY", true);
intent.putExtra("android.content.extra.SHOW_FILESIZE", true);
setInitialUri(fragment.getContext(), intent, initial);
fragment.startActivityForResult(intent, rc);
}
@TargetApi(Build.VERSION_CODES.O)
private static void setInitialUri(Context context, Intent intent, Uri uri) {
if (uri == null || preLollipop() || !uri.getScheme().equals(SCHEME_CONTENT)) {
if (uri == null || !uri.getScheme().equals(SCHEME_CONTENT)) {
return;
}
@ -174,7 +169,7 @@ public class FileHelper {
}
Uri share = getUriForFile(context, FILE_PROVIDER_AUTHORITY, new File(uri.getPath()));
intent.setDataAndType(share, mimeType);
grantReadPermissions(context, intent, share);
grantReadPermissions(intent);
PackageManager packageManager = context.getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
context.startActivity(intent);
@ -183,19 +178,8 @@ public class FileHelper {
}
}
private static void grantReadPermissions(Context context, Intent intent, Uri uri) {
if (atLeastLollipop()) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
List<ResolveInfo> resolveInfoList =
context
.getPackageManager()
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resolveInfoList) {
context.grantUriPermission(
resolveInfo.activityInfo.packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
private static void grantReadPermissions(Intent intent) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
public static Uri newFile(

@ -1,10 +1,10 @@
package org.tasks.injection;
import android.app.Application;
import android.content.Context;
import androidx.multidex.MultiDexApplication;
import org.tasks.locale.Locale;
public abstract class InjectingApplication extends MultiDexApplication {
public abstract class InjectingApplication extends Application {
private ApplicationComponent applicationComponent;

@ -5,7 +5,6 @@ import static androidx.preference.PreferenceManager.setDefaultValues;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Sets.newHashSet;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static java.util.Collections.emptySet;
import android.content.ContentResolver;
@ -13,7 +12,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Binder;
@ -525,7 +523,7 @@ public class Preferences {
}
public boolean showSubtasks() {
return atLeastLollipop() && getBoolean(R.string.p_show_subtasks, false);
return getBoolean(R.string.p_show_subtasks, false);
}
public int getThemeBase() {

@ -6,7 +6,6 @@ import android.os.Bundle
import androidx.annotation.StringRes
import androidx.preference.Preference
import androidx.preference.SwitchPreferenceCompat
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.dao.Database
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.service.TaskDeleter
@ -99,13 +98,11 @@ class Advanced : InjectingPreferenceFragment() {
if (requestCode == REQUEST_CODE_FILES_DIR) {
if (resultCode == Activity.RESULT_OK) {
val uri = data!!.data!!
if (AndroidUtilities.atLeastLollipop()) {
requireContext().contentResolver
.takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
}
requireContext().contentResolver
.takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
preferences.setUri(R.string.p_attachment_dir, uri)
updateAttachmentDirectory()
}

@ -6,7 +6,6 @@ import android.os.Bundle
import androidx.preference.Preference
import androidx.preference.SwitchPreferenceCompat
import com.google.api.services.drive.DriveScopes
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity
import org.tasks.PermissionUtil
import org.tasks.R
@ -82,13 +81,11 @@ class Backups : InjectingPreferenceFragment() {
if (requestCode == REQUEST_CODE_BACKUP_DIR) {
if (resultCode == RESULT_OK && data != null) {
val uri = data.data!!
if (AndroidUtilities.atLeastLollipop()) {
context?.contentResolver
?.takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
}
context?.contentResolver
?.takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
preferences.setUri(R.string.p_backup_dir, uri)
updateBackupDirectory()
}

@ -11,7 +11,6 @@ import android.os.Handler
import androidx.annotation.StringRes
import androidx.preference.Preference
import com.google.common.base.Strings
import com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop
import com.todoroo.astrid.api.Filter
import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
@ -126,8 +125,6 @@ class LookAndFeel : InjectingPreferenceFragment() {
false
}
requires(R.string.task_list_options, atLeastLollipop(), R.string.p_show_subtasks)
@Suppress("ConstantConditionIf")
if (BuildConfig.FLAVOR != "googleplay") {
removeGroup(R.string.TEA_control_location)

@ -1,16 +1,8 @@
package org.tasks.tags;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static org.tasks.preferences.ResourceResolver.getData;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
@ -126,18 +118,8 @@ public class CheckBoxTriStates extends AppCompatCheckBox {
int color = state == State.UNCHECKED
? getResources().getColor(R.color.icon_tint)
: getData(getContext(), R.attr.colorAccent);
if (atLeastLollipop()) {
drawable = original.mutate();
DrawableCompat.setTint(drawable, color);
} else {
Bitmap bitmap = ((BitmapDrawable) original).getBitmap();
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
Bitmap bitmapResult = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapResult);
canvas.drawBitmap(bitmap, 0, 0, paint);
drawable = new BitmapDrawable(getContext().getResources(), bitmapResult);
}
drawable = original.mutate();
DrawableCompat.setTint(drawable, color);
drawable.setAlpha(alpha);
setButtonDrawable(drawable);
}

@ -1,7 +1,5 @@
package org.tasks.tasklist;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import android.graphics.Paint;
import android.util.DisplayMetrics;
import android.view.View;
@ -123,13 +121,9 @@ public class SubtaskViewHolder extends RecyclerView.ViewHolder {
private void setIndent(int indent) {
int indentSize = getIndentSize(indent);
if (atLeastLollipop()) {
MarginLayoutParams layoutParams = (MarginLayoutParams) rowBody.getLayoutParams();
layoutParams.setMarginStart(indentSize);
rowBody.setLayoutParams(layoutParams);
} else {
rowBody.setPadding(indentSize, rowBody.getPaddingTop(), 0, rowBody.getPaddingBottom());
}
MarginLayoutParams layoutParams = (MarginLayoutParams) rowBody.getLayoutParams();
layoutParams.setMarginStart(indentSize);
rowBody.setLayoutParams(layoutParams);
}
public interface Callbacks {

@ -1,6 +1,5 @@
package org.tasks.tasklist;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.DateUtilities.getRelativeDateTime;
import android.annotation.SuppressLint;
@ -12,7 +11,6 @@ import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.core.widget.TextViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -178,13 +176,9 @@ public class ViewHolder extends RecyclerView.ViewHolder {
public void setIndent(int indent) {
this.indent = indent;
int indentSize = getIndentSize(indent);
if (atLeastLollipop()) {
MarginLayoutParams layoutParams = (MarginLayoutParams) row.getLayoutParams();
layoutParams.setMarginStart(indentSize);
row.setLayoutParams(layoutParams);
} else {
rowBody.setPadding(indentSize, rowBody.getPaddingTop(), 0, rowBody.getPaddingBottom());
}
MarginLayoutParams layoutParams = (MarginLayoutParams) row.getLayoutParams();
layoutParams.setMarginStart(indentSize);
row.setLayoutParams(layoutParams);
}
float getShiftSize() {

@ -62,7 +62,7 @@ public class ViewHolderFactory {
return new ViewHolder(
(Activity) context,
(ViewGroup)
LayoutInflater.from(context).inflate(R.layout.task_adapter_row_simple, parent, false),
LayoutInflater.from(context).inflate(R.layout.task_adapter_row, parent, false),
preferences,
fontSize,
chipProvider,

@ -1,6 +1,5 @@
package org.tasks.themes;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo;
@ -243,15 +242,11 @@ public class ThemeColor implements Pickable {
}
public void setStatusBarColor(Activity activity) {
if (atLeastLollipop()) {
activity.getWindow().setStatusBarColor(colorPrimaryVariant);
}
activity.getWindow().setStatusBarColor(colorPrimaryVariant);
}
public void setStatusBarColor(DrawerLayout drawerLayout) {
if (atLeastLollipop()) {
drawerLayout.setStatusBarBackgroundColor(colorPrimaryVariant);
}
drawerLayout.setStatusBarBackgroundColor(colorPrimaryVariant);
if (atLeastMarshmallow()) {
int systemUiVisibility = applyLightStatusBarFlag(drawerLayout.getSystemUiVisibility());
drawerLayout.setSystemUiVisibility(systemUiVisibility);
@ -281,9 +276,7 @@ public class ThemeColor implements Pickable {
}
public void applyToNavigationBar(Activity activity) {
if (atLeastLollipop()) {
activity.getWindow().setNavigationBarColor(getPrimaryColor());
}
activity.getWindow().setNavigationBarColor(getPrimaryColor());
if (atLeastOreo()) {
View decorView = activity.getWindow().getDecorView();
@ -311,10 +304,8 @@ public class ThemeColor implements Pickable {
}
public void applyTaskDescription(Activity activity, String description) {
if (atLeastLollipop()) {
activity.setTaskDescription(
new ActivityManager.TaskDescription(description, null, getPrimaryColor()));
}
activity.setTaskDescription(
new ActivityManager.TaskDescription(description, null, getPrimaryColor()));
}
@Override

@ -1,8 +1,6 @@
package org.tasks.ui;
import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
import static org.tasks.LocalBroadcastManager.REFRESH;
import static org.tasks.LocalBroadcastManager.REFRESH_LIST;
@ -17,7 +15,6 @@ import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.drawerlayout.widget.DrawerLayout.SimpleDrawerListener;
import androidx.fragment.app.FragmentActivity;
@ -91,10 +88,8 @@ public class NavigationDrawerFragment extends InjectingFragment {
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
recyclerView = layout.findViewById(R.id.recycler_view);
if (atLeastLollipop()) {
((ScrimInsetsFrameLayout) layout.findViewById(R.id.scrim_layout))
.setOnInsetsCallback(insets -> recyclerView.setPadding(0, insets.top, 0, 0));
}
((ScrimInsetsFrameLayout) layout.findViewById(R.id.scrim_layout))
.setOnInsetsCallback(insets -> recyclerView.setPadding(0, insets.top, 0, 0));
return layout;
}
@ -148,11 +143,6 @@ public class NavigationDrawerFragment extends InjectingFragment {
public void setUp(DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(FRAGMENT_NAVIGATION_DRAWER);
mDrawerLayout = drawerLayout;
if (preLollipop()) {
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
}
}
public void setSelected(Filter selected) {

@ -1,9 +1,6 @@
package org.tasks.ui;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
@ -16,20 +13,16 @@ import androidx.core.content.res.ResourcesCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import java.util.List;
import org.tasks.R;
import org.tasks.themes.ThemeAccent;
public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
@NonNull private final Context context;
private final ThemeAccent accent;
private final int alpha;
private final int tint;
public SingleCheckedArrayAdapter(
@NonNull Context context, @NonNull List<String> items, ThemeAccent accent) {
public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<String> items) {
super(context, R.layout.simple_list_item_single_checkmark, items);
this.context = context;
this.accent = accent;
this.alpha =
(int) (255 * ResourcesCompat.getFloat(context.getResources(), R.dimen.alpha_secondary));
this.tint = ContextCompat.getColor(context, R.color.icon_tint);
@ -39,21 +32,6 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent);
if (preLollipop()) {
ColorStateList tintList =
new ColorStateList(
new int[][] {
new int[] {-android.R.attr.state_checked}, new int[] {android.R.attr.state_checked}
},
new int[] {
ResourcesCompat.getColor(context.getResources(), android.R.color.transparent, null),
accent.getAccentColor()
});
Drawable original = ContextCompat.getDrawable(context, R.drawable.ic_outline_done_24px);
Drawable wrapped = DrawableCompat.wrap(original.mutate());
DrawableCompat.setTintList(wrapped, tintList);
view.setCheckMarkDrawable(wrapped);
}
int drawable = getDrawable();
if (drawable > 0) {
Drawable original = ContextCompat.getDrawable(context, drawable);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/drawer_background_selected" android:state_selected="true"/>
</selector>

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="@color/ripple_material_dark"
xmlns:android="http://schemas.android.com/apk/res/android" />

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="@color/ripple_material_light"
xmlns:android="http://schemas.android.com/apk/res/android" />

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="@color/ripple_material_dark"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/mask"
android:drawable="@android:color/white" />
</ripple>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="@color/ripple_material_light"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/mask">
<color android:color="@android:color/white" />
</item>
</ripple>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/drawer_color_selected" android:state_selected="true"/>
<item android:drawable="@color/drawer_color"/>
<item android:drawable="@drawable/drawer_background_selected" android:state_selected="true"/>
</selector>

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<color android:color="@android:color/transparent"
<ripple android:color="@color/ripple_material_dark"
xmlns:android="http://schemas.android.com/apk/res/android" />

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<color android:color="@android:color/transparent"
<ripple android:color="@color/ripple_material_light"
xmlns:android="http://schemas.android.com/apk/res/android" />

@ -1,3 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<color android:color="@android:color/transparent"
xmlns:android="http://schemas.android.com/apk/res/android" />
<ripple android:color="@color/ripple_material_dark"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/mask"
android:drawable="@android:color/white" />
</ripple>

@ -1,3 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<color android:color="@android:color/transparent"
xmlns:android="http://schemas.android.com/apk/res/android" />
<ripple android:color="@color/ripple_material_light"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/mask">
<color android:color="@android:color/white" />
</item>
</ripple>

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="1px"
app:cardBackgroundColor="?android:colorBackground"
app:cardCornerRadius="0dp"
app:cardElevation="?attr/card_elevation"
app:cardPreventCornerOverlap="false">
<include layout="@layout/task_adapter_row_body"/>
<View
style="@style/horizontal_divider"
android:visibility="?attr/horizontal_divider_visibility"
android:layout_gravity="bottom" />
</com.google.android.material.card.MaterialCardView>

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="1px"
app:cardBackgroundColor="?android:colorBackground"
app:cardCornerRadius="0dp"
app:cardElevation="?attr/card_elevation"
app:cardPreventCornerOverlap="false">
<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowBody"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingStart="0dp"
android:paddingEnd="@dimen/half_keyline_first"
android:clickable="true"
android:focusable="true">
<com.todoroo.astrid.ui.CheckableImageView
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_second"
tools:src="@drawable/ic_outline_check_box_outline_blank_24px" />
<TextView
android:id="@+id/due_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/title"
android:layout_alignParentEnd="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingStart="@dimen/half_keyline_first"
android:paddingEnd="@dimen/half_keyline_first"
android:ellipsize="end"
android:singleLine="true"
android:textSize="14sp"
tools:text="Tmrrw" />
<ImageView
android:id="@+id/hidden_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/completeBox"
android:paddingEnd="2dp"
android:paddingStart="0dp"
android:src="@drawable/ic_outline_visibility_off_24px"
android:tint="@color/icon_tint_with_alpha"
android:contentDescription="@string/widget_due_date_hidden" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/hidden_icon"
android:layout_toStartOf="@id/due_date"
android:paddingStart="0dp"
android:paddingEnd="@dimen/half_keyline_first"
android:ellipsize="end"
android:gravity="start|top"
android:maxLines="1"
android:singleLine="true"
android:textAlignment="viewStart"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/task_edit_text_size"
android:drawablePadding="2dp"
app:drawableTint="@color/icon_tint_with_alpha"
tools:text="Task title"
tools:textColor="@color/text_primary" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:paddingStart="@dimen/keyline_content_inset"
android:paddingEnd="@dimen/keyline_first"
android:ellipsize="end"
android:gravity="start"
android:maxLines="2"
android:textAlignment="viewStart"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/task_edit_text_size"
android:visibility="gone"
tools:text="Task description" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group"
android:layout_below="@id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:layout_marginStart="@dimen/keyline_content_inset"
android:layout_marginEnd="@dimen/keyline_first"
android:visibility="gone"
app:chipSpacingHorizontal="@dimen/chip_spacing"
app:chipSpacingVertical="@dimen/chip_spacing" />
</RelativeLayout>
<View
style="@style/horizontal_divider"
android:visibility="?attr/horizontal_divider_visibility"
android:layout_gravity="bottom" />
</com.google.android.material.card.MaterialCardView>

@ -1,98 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowBody"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingStart="0dp"
android:paddingEnd="@dimen/half_keyline_first"
android:clickable="true"
android:focusable="true">
<com.todoroo.astrid.ui.CheckableImageView
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_second"
tools:src="@drawable/ic_outline_check_box_outline_blank_24px" />
<TextView
android:id="@+id/due_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/title"
android:layout_alignParentEnd="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingStart="@dimen/half_keyline_first"
android:paddingEnd="@dimen/half_keyline_first"
android:ellipsize="end"
android:singleLine="true"
android:textSize="14sp"
tools:text="Tmrrw" />
<ImageView
android:id="@+id/hidden_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/completeBox"
android:paddingEnd="2dp"
android:paddingStart="0dp"
android:src="@drawable/ic_outline_visibility_off_24px"
android:tint="@color/icon_tint_with_alpha"
android:contentDescription="@string/widget_due_date_hidden" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/hidden_icon"
android:layout_toStartOf="@id/due_date"
android:paddingStart="0dp"
android:paddingEnd="@dimen/half_keyline_first"
android:ellipsize="end"
android:gravity="start|top"
android:maxLines="1"
android:singleLine="true"
android:textAlignment="viewStart"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/task_edit_text_size"
android:drawablePadding="2dp"
app:drawableTint="@color/icon_tint_with_alpha"
tools:text="Task title"
tools:textColor="@color/text_primary" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:paddingStart="@dimen/keyline_content_inset"
android:paddingEnd="@dimen/keyline_first"
android:ellipsize="end"
android:gravity="start"
android:maxLines="2"
android:textAlignment="viewStart"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/task_edit_text_size"
android:visibility="gone"
tools:text="Task description" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group"
android:layout_below="@id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:layout_marginStart="@dimen/keyline_content_inset"
android:layout_marginEnd="@dimen/keyline_first"
android:visibility="gone"
app:chipSpacingHorizontal="@dimen/chip_spacing"
app:chipSpacingVertical="@dimen/chip_spacing" />
</RelativeLayout>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="?android:colorBackground">
<include layout="@layout/task_adapter_row_body"/>
<View style="@style/horizontal_divider"/>
</LinearLayout>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="elevation_padding">3dp</dimen>
</resources>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="font_fontFamily_medium">sans-serif-medium</string>
</resources>

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="priority_button" parent="priority_button_base">
</style>
<style name="vertical_divider">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">0dp</item>
<item name="android:visibility">gone</item>
</style>
<style name="BaseHorizontalDivider">
<item name="android:background">?attr/dividerHorizontal</item>
</style>
</resources>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Tasks" parent="TasksBase">
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>

@ -20,7 +20,7 @@
<dimen name="elevation_app_bar">4dp</dimen>
<dimen name="elevation_task_list">2dp</dimen>
<dimen name="elevation_refresh_indicator">3dp</dimen>
<dimen name="elevation_padding">0dp</dimen>
<dimen name="elevation_padding">3dp</dimen>
<dimen name="widget_padding_compact">6dp</dimen>
<dimen name="widget_padding">12dp</dimen>

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="font_fontFamily_medium">sans-serif</string>
<string name="font_fontFamily_medium">sans-serif-medium</string>
</resources>

@ -109,13 +109,13 @@
<!--=============================================== MainActivity == -->
<style name="BaseHorizontalDivider">
<item name="android:background">@color/divider</item>
<item name="android:background">?attr/dividerHorizontal</item>
</style>
<style name="vertical_divider">
<item name="android:layout_height">match_parent</item>
<item name="android:layout_width">1dp</item>
<item name="android:background">@color/divider</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">0dp</item>
<item name="android:visibility">gone</item>
</style>
<style name="horizontal_divider" parent="BaseHorizontalDivider">
@ -131,16 +131,11 @@
<item name="android:elevation" tools:ignore="NewApi">@dimen/elevation_refresh_indicator</item>
</style>
<style name="priority_button_base" parent="Widget.AppCompat.CompoundButton.RadioButton">
<style name="priority_button" parent="Widget.AppCompat.CompoundButton.RadioButton">
<item name="android:layout_width">@dimen/priority_button_width</item>
<item name="android:layout_height">24dp</item>
</style>
<style name="priority_button" parent="priority_button_base">
<!-- hide janky selected item background on pre-lollipop devices -->
<item name="android:background">@android:color/transparent</item>
</style>
<style name="CardViewStyle" parent="Widget.MaterialComponents.CardView">
<item name="android:layout_marginTop">0dp</item>
<item name="android:layout_marginBottom">0dp</item>

@ -24,7 +24,10 @@
<item name="mdtp_theme_dark">@bool/is_dark</item>
</style>
<style name="Tasks" parent="TasksBase"/>
<style name="Tasks" parent="TasksBase">
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
<style name="TasksDialogAlert" parent="DayNightAlert">
<item name="android:textColorPrimary">@color/text_primary</item>

@ -1,7 +1,7 @@
object Versions {
const val kotlin = "1.3.71"
const val targetSdk = 29
const val minSdk = 19
const val minSdk = 21
const val dagger = "2.27"
const val butterknife = "10.2.1"
const val work = "2.3.4"

Loading…
Cancel
Save