Drop support for Lollipop and Lollipop MR1

pull/996/head
Alex Baker 6 years ago
parent 79ca62cbea
commit fbeef45bb9

@ -134,18 +134,10 @@ public class AndroidUtilities {
return (int) (dp * displayMetrics.density + 0.5f); return (int) (dp * displayMetrics.density + 0.5f);
} }
public static boolean preMarshmallow() {
return !atLeastMarshmallow();
}
public static boolean preOreo() { public static boolean preOreo() {
return !atLeastOreo(); return !atLeastOreo();
} }
public static boolean atLeastMarshmallow() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
public static boolean atLeastNougat() { public static boolean atLeastNougat() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N; return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
} }

@ -3,7 +3,6 @@ package com.todoroo.astrid.activity;
import static android.content.Intent.ACTION_SEND; import static android.content.Intent.ACTION_SEND;
import static android.content.Intent.ACTION_SEND_MULTIPLE; import static android.content.Intent.ACTION_SEND_MULTIPLE;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayList;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
import static org.tasks.files.FileHelper.copyToUri; import static org.tasks.files.FileHelper.copyToUri;
import static org.tasks.files.FileHelper.getFilename; import static org.tasks.files.FileHelper.getFilename;
import static org.tasks.intents.TaskIntents.getTaskListIntent; import static org.tasks.intents.TaskIntents.getTaskListIntent;
@ -68,7 +67,7 @@ public final class ShareLinkActivity extends InjectingAppCompatActivity {
Intent intent = getIntent(); Intent intent = getIntent();
String action = intent.getAction(); String action = intent.getAction();
if (atLeastMarshmallow() && Intent.ACTION_PROCESS_TEXT.equals(action)) { if (Intent.ACTION_PROCESS_TEXT.equals(action)) {
CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT); CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);
if (text != null) { if (text != null) {
Task task = taskCreator.createWithValues(text.toString()); Task task = taskCreator.createWithValues(text.toString());

@ -36,7 +36,7 @@ import org.tasks.data.CaldavDao;
import org.tasks.databinding.ActivityCaldavAccountSettingsBinding; import org.tasks.databinding.ActivityCaldavAccountSettingsBinding;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ThemedInjectingAppCompatActivity; import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.security.Encryption; import org.tasks.security.KeyStoreEncryption;
import org.tasks.ui.DisplayableException; import org.tasks.ui.DisplayableException;
import timber.log.Timber; import timber.log.Timber;
@ -46,7 +46,7 @@ public abstract class BaseCaldavAccountSettingsActivity extends ThemedInjectingA
public static final String EXTRA_CALDAV_DATA = "caldavData"; // $NON-NLS-1$ public static final String EXTRA_CALDAV_DATA = "caldavData"; // $NON-NLS-1$
protected static final String PASSWORD_MASK = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"; protected static final String PASSWORD_MASK = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
@Inject protected CaldavDao caldavDao; @Inject protected CaldavDao caldavDao;
@Inject protected Encryption encryption; @Inject protected KeyStoreEncryption encryption;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject TaskDeleter taskDeleter; @Inject TaskDeleter taskDeleter;
@Inject Inventory inventory; @Inject Inventory inventory;

@ -45,7 +45,7 @@ import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar; import org.tasks.data.CaldavCalendar;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.security.Encryption; import org.tasks.security.KeyStoreEncryption;
import org.tasks.ui.DisplayableException; import org.tasks.ui.DisplayableException;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
@ -54,7 +54,7 @@ import timber.log.Timber;
public class CaldavClient { public class CaldavClient {
private final Encryption encryption; private final KeyStoreEncryption encryption;
private final Preferences preferences; private final Preferences preferences;
private final DebugNetworkInterceptor interceptor; private final DebugNetworkInterceptor interceptor;
private final OkHttpClient httpClient; private final OkHttpClient httpClient;
@ -66,7 +66,7 @@ public class CaldavClient {
@Inject @Inject
CaldavClient( CaldavClient(
@ForApplication Context context, @ForApplication Context context,
Encryption encryption, KeyStoreEncryption encryption,
Preferences preferences, Preferences preferences,
DebugNetworkInterceptor interceptor) { DebugNetworkInterceptor interceptor) {
this.context = context; this.context = context;
@ -80,7 +80,7 @@ public class CaldavClient {
private CaldavClient( private CaldavClient(
Context context, Context context,
Encryption encryption, KeyStoreEncryption encryption,
Preferences preferences, Preferences preferences,
DebugNetworkInterceptor interceptor, DebugNetworkInterceptor interceptor,
String url, String url,

@ -9,7 +9,7 @@ import androidx.room.ColumnInfo;
import androidx.room.Entity; import androidx.room.Entity;
import androidx.room.Ignore; import androidx.room.Ignore;
import androidx.room.PrimaryKey; import androidx.room.PrimaryKey;
import org.tasks.security.Encryption; import org.tasks.security.KeyStoreEncryption;
@Entity(tableName = "caldav_accounts") @Entity(tableName = "caldav_accounts")
public class CaldavAccount implements Parcelable { public class CaldavAccount implements Parcelable {
@ -129,7 +129,7 @@ public class CaldavAccount implements Parcelable {
this.password = password; this.password = password;
} }
public String getPassword(Encryption encryption) { public String getPassword(KeyStoreEncryption encryption) {
return encryption.decrypt(password); return encryption.decrypt(password);
} }
@ -141,7 +141,7 @@ public class CaldavAccount implements Parcelable {
this.encryptionKey = encryptionKey; this.encryptionKey = encryptionKey;
} }
public String getEncryptionPassword(Encryption encryption) { public String getEncryptionPassword(KeyStoreEncryption encryption) {
return encryption.decrypt(encryptionKey); return encryption.decrypt(encryptionKey);
} }

@ -18,15 +18,12 @@ import butterknife.ButterKnife
import butterknife.OnClick import butterknife.OnClick
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import org.tasks.R import org.tasks.R
import org.tasks.databinding.DialogDateTimePickerBinding import org.tasks.databinding.DialogDateTimePickerBinding
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.dialogs.MyDatePickerDialog.newDatePicker
import org.tasks.dialogs.MyTimePickerDialog.newTimePicker import org.tasks.dialogs.MyTimePickerDialog.newTimePicker
import org.tasks.injection.DialogFragmentComponent import org.tasks.injection.DialogFragmentComponent
import org.tasks.injection.InjectingBottomSheetDialogFragment import org.tasks.injection.InjectingBottomSheetDialogFragment
@ -70,9 +67,7 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
private const val EXTRA_AUTO_CLOSE = "extra_auto_close" private const val EXTRA_AUTO_CLOSE = "extra_auto_close"
private const val EXTRA_SELECTED = "extra_selected" private const val EXTRA_SELECTED = "extra_selected"
private const val REQUEST_TIME = 10101 private const val REQUEST_TIME = 10101
private const val REQUEST_DATE = 10102
private const val FRAG_TAG_TIME_PICKER = "frag_tag_time_picker" private const val FRAG_TAG_TIME_PICKER = "frag_tag_time_picker"
private const val FRAG_TAG_DATE_PICKER = "frag_tag_date_picker"
fun newDateTimePicker(task: Long, current: Long, autoClose: Boolean): DateTimePicker { fun newDateTimePicker(task: Long, current: Long, autoClose: Boolean): DateTimePicker {
val bundle = Bundle() val bundle = Bundle()
@ -97,9 +92,6 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DialogDateTimePickerBinding.inflate(theme.getLayoutInflater(context)) binding = DialogDateTimePickerBinding.inflate(theme.getLayoutInflater(context))
if (AndroidUtilities.preMarshmallow()) {
binding.shortcuts.pickDateButton.visibility = View.VISIBLE
}
morning = preferences.dateShortcutMorning + 1000 morning = preferences.dateShortcutMorning + 1000
afternoon = preferences.dateShortcutAfternoon + 1000 afternoon = preferences.dateShortcutAfternoon + 1000
evening = preferences.dateShortcutEvening + 1000 evening = preferences.dateShortcutEvening + 1000
@ -111,7 +103,6 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
ButterKnife.bind(this, binding.root) ButterKnife.bind(this, binding.root)
binding.shortcuts.nextWeekButton.text = binding.shortcuts.nextWeekButton.text =
getString(R.string.next, DateUtilities.getWeekdayShort(newDateTime().plusWeeks(1), locale.locale)) getString(R.string.next, DateUtilities.getWeekdayShort(newDateTime().plusWeeks(1), locale.locale))
if (atLeastMarshmallow()) {
binding.calendarView.setOnDateChangeListener { _, y, m, d -> binding.calendarView.setOnDateChangeListener { _, y, m, d ->
selected = DateTime(y, m + 1, d, selected?.hourOfDay ?: 0, selected?.minuteOfHour selected = DateTime(y, m + 1, d, selected?.hourOfDay ?: 0, selected?.minuteOfHour
?: 0, selected?.secondOfMinute ?: 0) ?: 0, selected?.secondOfMinute ?: 0)
@ -122,7 +113,6 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
if (firstDayOfWeek in 1..7) { if (firstDayOfWeek in 1..7) {
binding.calendarView.firstDayOfWeek = firstDayOfWeek binding.calendarView.firstDayOfWeek = firstDayOfWeek
} }
}
val timestamp = savedInstanceState?.getLong(EXTRA_SELECTED) val timestamp = savedInstanceState?.getLong(EXTRA_SELECTED)
?: requireArguments().getLong(EXTRA_TIMESTAMP) ?: requireArguments().getLong(EXTRA_TIMESTAMP)
selected = if (timestamp > 0) DateTime(timestamp) else null selected = if (timestamp > 0) DateTime(timestamp) else null
@ -176,7 +166,7 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
} else { } else {
binding.shortcuts.timeGroup.check(R.id.no_time) binding.shortcuts.timeGroup.check(R.id.no_time)
} }
if (atLeastMarshmallow() && selected != null) { if (selected != null) {
binding.calendarView.setDate(selected!!.millis, true, true) binding.calendarView.setDate(selected!!.millis, true, true)
} }
} }
@ -220,12 +210,6 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
.show(parentFragmentManager, FRAG_TAG_TIME_PICKER) .show(parentFragmentManager, FRAG_TAG_TIME_PICKER)
} }
@OnClick(R.id.pick_date_button)
fun pickDate() {
newDatePicker(this, REQUEST_DATE, selected?.millis ?: today.millis)
.show(parentFragmentManager, FRAG_TAG_DATE_PICKER)
}
private fun returnSelectedTime(millisOfDay: Int) { private fun returnSelectedTime(millisOfDay: Int) {
if (selected == null) { if (selected == null) {
selected = today.withMillisOfDay(millisOfDay) selected = today.withMillisOfDay(millisOfDay)
@ -336,13 +320,6 @@ class DateTimePicker : InjectingBottomSheetDialogFragment() {
} else { } else {
refreshButtons() refreshButtons()
} }
} else if (requestCode == REQUEST_DATE) {
if (resultCode == RESULT_OK) {
val timestamp = data!!.getLongExtra(MyDatePickerDialog.EXTRA_TIMESTAMP, today.millis)
returnDate(timestamp)
} else {
refreshButtons()
}
} else { } else {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
} }

@ -28,7 +28,7 @@ import org.tasks.data.CaldavAccount;
import org.tasks.databinding.ActivityEtesyncEncryptionSettingsBinding; import org.tasks.databinding.ActivityEtesyncEncryptionSettingsBinding;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.ThemedInjectingAppCompatActivity; import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.security.Encryption; import org.tasks.security.KeyStoreEncryption;
import org.tasks.ui.DisplayableException; import org.tasks.ui.DisplayableException;
import timber.log.Timber; import timber.log.Timber;
@ -40,7 +40,7 @@ public class EncryptionSettingsActivity extends ThemedInjectingAppCompatActivity
public static final String EXTRA_DERIVED_KEY = "extra_derived_key"; public static final String EXTRA_DERIVED_KEY = "extra_derived_key";
@Inject EteSyncClient client; @Inject EteSyncClient client;
@Inject Encryption encryption; @Inject KeyStoreEncryption encryption;
private ActivityEtesyncEncryptionSettingsBinding binding; private ActivityEtesyncEncryptionSettingsBinding binding;
private UserInfo userInfo; private UserInfo userInfo;

@ -46,7 +46,7 @@ import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar; import org.tasks.data.CaldavCalendar;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.security.Encryption; import org.tasks.security.KeyStoreEncryption;
import timber.log.Timber; import timber.log.Timber;
public class EteSyncClient { public class EteSyncClient {
@ -55,7 +55,7 @@ public class EteSyncClient {
private static final int MAX_FETCH = 50; private static final int MAX_FETCH = 50;
private static final int MAX_PUSH = 30; private static final int MAX_PUSH = 30;
private final Encryption encryption; private final KeyStoreEncryption encryption;
private final Preferences preferences; private final Preferences preferences;
private final DebugNetworkInterceptor interceptor; private final DebugNetworkInterceptor interceptor;
private final String username; private final String username;
@ -70,7 +70,7 @@ public class EteSyncClient {
@Inject @Inject
public EteSyncClient( public EteSyncClient(
@ForApplication Context context, @ForApplication Context context,
Encryption encryption, KeyStoreEncryption encryption,
Preferences preferences, Preferences preferences,
DebugNetworkInterceptor interceptor) { DebugNetworkInterceptor interceptor) {
this.context = context; this.context = context;
@ -87,7 +87,7 @@ public class EteSyncClient {
private EteSyncClient( private EteSyncClient(
Context context, Context context,
Encryption encryption, KeyStoreEncryption encryption,
Preferences preferences, Preferences preferences,
DebugNetworkInterceptor interceptor, DebugNetworkInterceptor interceptor,
String url, String url,

@ -1,7 +1,5 @@
package org.tasks.injection; package org.tasks.injection;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
import android.content.Context; import android.content.Context;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -28,9 +26,6 @@ import org.tasks.locale.Locale;
import org.tasks.location.Geocoder; import org.tasks.location.Geocoder;
import org.tasks.location.MapboxGeocoder; import org.tasks.location.MapboxGeocoder;
import org.tasks.notifications.NotificationDao; import org.tasks.notifications.NotificationDao;
import org.tasks.security.Encryption;
import org.tasks.security.KeyStoreEncryption;
import org.tasks.security.NoEncryption;
@Module @Module
class ApplicationModule { class ApplicationModule {
@ -138,12 +133,6 @@ class ApplicationModule {
return database.getDeletionDao(); return database.getDeletionDao();
} }
@Provides
@ApplicationScope
public Encryption getEncryption() {
return atLeastMarshmallow() ? new KeyStoreEncryption() : new NoEncryption();
}
@Provides @Provides
BillingClient getBillingClient(Inventory inventory, Tracker tracker) { BillingClient getBillingClient(Inventory inventory, Tracker tracker) {
return new BillingClientImpl(context, inventory, tracker); return new BillingClientImpl(context, inventory, tracker);

@ -1,6 +1,5 @@
package org.tasks.jobs; package org.tasks.jobs;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo;
import static com.todoroo.andlib.utility.DateUtilities.now; import static com.todoroo.andlib.utility.DateUtilities.now;
import static io.reactivex.Single.just; import static io.reactivex.Single.just;
@ -200,11 +199,7 @@ public class WorkManager {
} }
} else { } else {
PendingIntent pendingIntent = getNotificationPendingIntent(); PendingIntent pendingIntent = getNotificationPendingIntent();
if (atLeastMarshmallow()) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent); alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent);
} else {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
}
} }
} }

@ -12,7 +12,6 @@ import android.speech.tts.TextToSpeech
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.voice.VoiceOutputAssistant import com.todoroo.astrid.voice.VoiceOutputAssistant
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
@ -143,12 +142,10 @@ class Notifications : InjectingPreferenceFragment() {
} }
private fun checkBatteryOptimizations() { private fun checkBatteryOptimizations() {
if (atLeastMarshmallow()) {
val powerManager = requireContext().getSystemService(POWER_SERVICE) as PowerManager val powerManager = requireContext().getSystemService(POWER_SERVICE) as PowerManager
findPreference(R.string.disable_battery_optimizations).isVisible = findPreference(R.string.disable_battery_optimizations).isVisible =
!powerManager.isIgnoringBatteryOptimizations(getString(R.string.app_package)) !powerManager.isIgnoringBatteryOptimizations(getString(R.string.app_package))
} }
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()

@ -1,7 +1,5 @@
package org.tasks.scheduling; package org.tasks.scheduling;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
@ -23,11 +21,7 @@ public class AlarmManager {
@SuppressLint("NewApi") @SuppressLint("NewApi")
public void wakeup(long time, PendingIntent pendingIntent) { public void wakeup(long time, PendingIntent pendingIntent) {
if (atLeastMarshmallow()) {
alarmManager.setExactAndAllowWhileIdle( alarmManager.setExactAndAllowWhileIdle(
android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent); android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent);
} else {
alarmManager.setExact(android.app.AlarmManager.RTC_WAKEUP, time, pendingIntent);
}
} }
} }

@ -1,8 +0,0 @@
package org.tasks.security;
public interface Encryption {
String encrypt(String text);
String decrypt(String text);
}

@ -29,10 +29,11 @@ import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.GCMParameterSpec;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.injection.ApplicationScope;
import timber.log.Timber; import timber.log.Timber;
@RequiresApi(api = VERSION_CODES.M) @ApplicationScope
public class KeyStoreEncryption implements Encryption { public class KeyStoreEncryption {
private static final String ANDROID_KEYSTORE = "AndroidKeyStore"; private static final String ANDROID_KEYSTORE = "AndroidKeyStore";
private static final String ALIAS = "passwords"; private static final String ALIAS = "passwords";
@ -52,7 +53,6 @@ public class KeyStoreEncryption implements Encryption {
} }
} }
@Override
public String encrypt(String text) { public String encrypt(String text) {
byte[] iv = new byte[GCM_IV_LENGTH]; byte[] iv = new byte[GCM_IV_LENGTH];
new SecureRandom().nextBytes(iv); new SecureRandom().nextBytes(iv);
@ -69,7 +69,6 @@ public class KeyStoreEncryption implements Encryption {
} }
} }
@Override
public String decrypt(String text) { public String decrypt(String text) {
if (Strings.isNullOrEmpty(text)) { if (Strings.isNullOrEmpty(text)) {
return null; return null;

@ -1,14 +0,0 @@
package org.tasks.security;
public class NoEncryption implements Encryption {
@Override
public String encrypt(String text) {
return text;
}
@Override
public String decrypt(String text) {
return text;
}
}

@ -1,6 +1,5 @@
package org.tasks.themes; package org.tasks.themes;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo;
import android.app.Activity; import android.app.Activity;
@ -247,11 +246,9 @@ public class ThemeColor implements Pickable {
public void setStatusBarColor(DrawerLayout drawerLayout) { public void setStatusBarColor(DrawerLayout drawerLayout) {
drawerLayout.setStatusBarBackgroundColor(colorPrimaryVariant); drawerLayout.setStatusBarBackgroundColor(colorPrimaryVariant);
if (atLeastMarshmallow()) {
int systemUiVisibility = applyLightStatusBarFlag(drawerLayout.getSystemUiVisibility()); int systemUiVisibility = applyLightStatusBarFlag(drawerLayout.getSystemUiVisibility());
drawerLayout.setSystemUiVisibility(systemUiVisibility); drawerLayout.setSystemUiVisibility(systemUiVisibility);
} }
}
public void setStatusBarColor(CollapsingToolbarLayout layout) { public void setStatusBarColor(CollapsingToolbarLayout layout) {
layout.setContentScrimColor(colorPrimary); layout.setContentScrimColor(colorPrimary);
@ -268,12 +265,10 @@ public class ThemeColor implements Pickable {
} }
public void applyToStatusBarIcons(Activity activity) { public void applyToStatusBarIcons(Activity activity) {
if (atLeastMarshmallow()) {
View decorView = activity.getWindow().getDecorView(); View decorView = activity.getWindow().getDecorView();
int systemUiVisibility = applyLightStatusBarFlag(decorView.getSystemUiVisibility()); int systemUiVisibility = applyLightStatusBarFlag(decorView.getSystemUiVisibility());
decorView.setSystemUiVisibility(systemUiVisibility); decorView.setSystemUiVisibility(systemUiVisibility);
} }
}
public void applyToNavigationBar(Activity activity) { public void applyToNavigationBar(Activity activity) {
activity.getWindow().setNavigationBarColor(getPrimaryColor()); activity.getWindow().setNavigationBarColor(getPrimaryColor());
@ -285,7 +280,6 @@ public class ThemeColor implements Pickable {
} }
} }
@RequiresApi(api = VERSION_CODES.M)
private int applyLightStatusBarFlag(int flag) { private int applyLightStatusBarFlag(int flag) {
return isDark return isDark
? flag | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR ? flag | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:height="24dp"
android:width="24dp" />
<solid android:color="#FF000000" />
</shape>
</item>
<item>
<shape android:shape="oval">
<size
android:height="25dp"
android:width="25dp" />
<solid android:color="@android:color/transparent" />
<stroke
android:color="@color/text_tertiary"
android:width="1dp" />
</shape>
</item>
</layer-list>

@ -1,10 +1,27 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
android:shape="oval"> <item>
<shape android:shape="oval">
<size <size
android:height="24dp" android:height="24dp"
android:width="24dp" /> android:width="24dp" />
<solid android:color="#FF000000" /> <solid android:color="#FF000000" />
</shape> </shape>
</item>
<item>
<shape android:shape="oval">
<size
android:height="25dp"
android:width="25dp" />
<solid android:color="@android:color/transparent" />
<stroke
android:color="@color/text_tertiary"
android:width="1dp" />
</shape>
</item>
</layer-list>

@ -51,17 +51,6 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tomorrow_button" /> app:layout_constraintTop_toBottomOf="@+id/tomorrow_button" />
<com.google.android.material.button.MaterialButton
android:id="@+id/pick_date_button"
style="@style/DateTimeShortcuts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/shortcut_pick_date"
android:visibility="gone"
app:icon="@drawable/ic_outline_today_24px"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/next_week_button" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/no_date_button" android:id="@+id/no_date_button"
style="@style/DateTimeShortcuts" style="@style/DateTimeShortcuts"
@ -69,7 +58,7 @@
app:icon="@drawable/ic_outline_not_interested_24px" app:icon="@drawable/ic_outline_not_interested_24px"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pick_date_button" /> app:layout_constraintTop_toBottomOf="@+id/next_week_button" />
</com.google.android.material.button.MaterialButtonToggleGroup> </com.google.android.material.button.MaterialButtonToggleGroup>
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline

@ -22,8 +22,7 @@
android:id="@+id/calendar_view" android:id="@+id/calendar_view"
android:layout_below="@id/shortcuts" android:layout_below="@id/shortcuts"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"/>
android:visibility="@integer/calendar_view_visible"/>
</RelativeLayout> </RelativeLayout>

@ -561,7 +561,6 @@
<string name="chip_appearance_text_and_icon">Text und Symbol</string> <string name="chip_appearance_text_and_icon">Text und Symbol</string>
<string name="chip_appearance_text_only">Nur Text</string> <string name="chip_appearance_text_only">Nur Text</string>
<string name="chip_appearance_icon_only">Nur Symbol</string> <string name="chip_appearance_icon_only">Nur Symbol</string>
<string name="shortcut_pick_date">Wählen Sie ein Datum</string>
<string name="shortcut_pick_time">Wählen Sie eine Uhrzeit</string> <string name="shortcut_pick_time">Wählen Sie eine Uhrzeit</string>
<string name="no_time">Ohne Uhrzeit</string> <string name="no_time">Ohne Uhrzeit</string>
<string name="no_date">Kein Datum</string> <string name="no_date">Kein Datum</string>

@ -566,7 +566,6 @@
<string name="chip_appearance_text_and_icon">Texto e ícono</string> <string name="chip_appearance_text_and_icon">Texto e ícono</string>
<string name="chip_appearance_text_only">Sólo texto</string> <string name="chip_appearance_text_only">Sólo texto</string>
<string name="chip_appearance_icon_only">Icono sólo</string> <string name="chip_appearance_icon_only">Icono sólo</string>
<string name="shortcut_pick_date">Elija la fecha</string>
<string name="shortcut_pick_time">Elija la hora</string> <string name="shortcut_pick_time">Elija la hora</string>
<string name="no_time">No hay tiempo</string> <string name="no_time">No hay tiempo</string>
<string name="no_date">No hay fecha</string> <string name="no_date">No hay fecha</string>

@ -568,7 +568,6 @@
<string name="chip_appearance_text_and_icon">Testua eta ikonoa</string> <string name="chip_appearance_text_and_icon">Testua eta ikonoa</string>
<string name="chip_appearance_text_only">Testua soilik</string> <string name="chip_appearance_text_only">Testua soilik</string>
<string name="chip_appearance_icon_only">Ikonoa soilik</string> <string name="chip_appearance_icon_only">Ikonoa soilik</string>
<string name="shortcut_pick_date">Hautatu data</string>
<string name="shortcut_pick_time">Hautatu ordua</string> <string name="shortcut_pick_time">Hautatu ordua</string>
<string name="no_time">Ordurik ez</string> <string name="no_time">Ordurik ez</string>
<string name="no_date">Datarik ez</string> <string name="no_date">Datarik ez</string>

@ -414,7 +414,6 @@
<string name="calendar_event_created">Kalenterimerkintä luotu %s varten</string> <string name="calendar_event_created">Kalenterimerkintä luotu %s varten</string>
<string name="auto_dismiss_datetime_summary">Päivämäärän ja kellonajan valitsimet sulkeutuvat itsestään valittuasi aika</string> <string name="auto_dismiss_datetime_summary">Päivämäärän ja kellonajan valitsimet sulkeutuvat itsestään valittuasi aika</string>
<string name="auto_dismiss_datetime">Sulje päivän ja ajan valitsin itsestään</string> <string name="auto_dismiss_datetime">Sulje päivän ja ajan valitsin itsestään</string>
<string name="shortcut_pick_date">Aseta päivämäärä</string>
<string name="shortcut_pick_time">Aseta kellonaika</string> <string name="shortcut_pick_time">Aseta kellonaika</string>
<string name="no_time">Ei kellonaikaa</string> <string name="no_time">Ei kellonaikaa</string>
<string name="no_date">Ei päivämäärää</string> <string name="no_date">Ei päivämäärää</string>

@ -561,7 +561,6 @@
<string name="chip_appearance_text_and_icon">Texte et icône</string> <string name="chip_appearance_text_and_icon">Texte et icône</string>
<string name="chip_appearance_text_only">Texte seulement</string> <string name="chip_appearance_text_only">Texte seulement</string>
<string name="chip_appearance_icon_only">Icône seulement</string> <string name="chip_appearance_icon_only">Icône seulement</string>
<string name="shortcut_pick_date">Choisissez la date</string>
<string name="shortcut_pick_time">Choisissez l\'heure</string> <string name="shortcut_pick_time">Choisissez l\'heure</string>
<string name="no_time">Aucune heure</string> <string name="no_time">Aucune heure</string>
<string name="no_date">Aucune date</string> <string name="no_date">Aucune date</string>

@ -564,7 +564,6 @@
<string name="chip_appearance_text_and_icon">Szöveg és ikon</string> <string name="chip_appearance_text_and_icon">Szöveg és ikon</string>
<string name="chip_appearance_text_only">Csak szöveg</string> <string name="chip_appearance_text_only">Csak szöveg</string>
<string name="chip_appearance_icon_only">Csak ikon</string> <string name="chip_appearance_icon_only">Csak ikon</string>
<string name="shortcut_pick_date">Dátum kiválasztása</string>
<string name="shortcut_pick_time">Időpont kiválasztása</string> <string name="shortcut_pick_time">Időpont kiválasztása</string>
<string name="no_time">Időpont nélkül</string> <string name="no_time">Időpont nélkül</string>
<string name="no_date">Dátum nélkül</string> <string name="no_date">Dátum nélkül</string>

@ -488,7 +488,6 @@
<string name="calendar_event_created">Creato evento nel calendario per %s</string> <string name="calendar_event_created">Creato evento nel calendario per %s</string>
<string name="auto_dismiss_datetime_summary">Chiudi selezionatore data e ora dopo averne selezionato una</string> <string name="auto_dismiss_datetime_summary">Chiudi selezionatore data e ora dopo averne selezionato una</string>
<string name="auto_dismiss_datetime">Chiudi automaticamente selezionatore data e ora</string> <string name="auto_dismiss_datetime">Chiudi automaticamente selezionatore data e ora</string>
<string name="shortcut_pick_date">Scegli una data</string>
<string name="shortcut_pick_time">Scegli un\'ora</string> <string name="shortcut_pick_time">Scegli un\'ora</string>
<string name="no_time">Senza ora</string> <string name="no_time">Senza ora</string>
<string name="no_date">Senza data</string> <string name="no_date">Senza data</string>

@ -528,7 +528,6 @@
<string name="select_all">모두 선택</string> <string name="select_all">모두 선택</string>
<string name="no_time">마감시간 없음</string> <string name="no_time">마감시간 없음</string>
<string name="no_date">마감일 없음</string> <string name="no_date">마감일 없음</string>
<string name="shortcut_pick_date">날짜 선택</string>
<string name="shortcut_pick_time">시간 선택</string> <string name="shortcut_pick_time">시간 선택</string>
<string name="chip_appearance_icon_only">아이콘만</string> <string name="chip_appearance_icon_only">아이콘만</string>
<string name="chip_appearance_text_only">글자만</string> <string name="chip_appearance_text_only">글자만</string>

@ -556,7 +556,6 @@
<string name="custom_filter_or">ELLER</string> <string name="custom_filter_or">ELLER</string>
<string name="custom_filter_and">OG</string> <string name="custom_filter_and">OG</string>
<string name="auto_dismiss_datetime_widget">Miniprogram</string> <string name="auto_dismiss_datetime_widget">Miniprogram</string>
<string name="shortcut_pick_date">Velg dato</string>
<string name="shortcut_pick_time">Velg tidspunkt</string> <string name="shortcut_pick_time">Velg tidspunkt</string>
<string name="no_time">Ingen tid</string> <string name="no_time">Ingen tid</string>
<string name="no_date">Ingen dato</string> <string name="no_date">Ingen dato</string>

@ -561,7 +561,6 @@
<string name="chip_appearance_text_and_icon">Tekst en icon</string> <string name="chip_appearance_text_and_icon">Tekst en icon</string>
<string name="chip_appearance_text_only">Alleen tekst</string> <string name="chip_appearance_text_only">Alleen tekst</string>
<string name="chip_appearance_icon_only">Alleen icon</string> <string name="chip_appearance_icon_only">Alleen icon</string>
<string name="shortcut_pick_date">Kies een datum</string>
<string name="shortcut_pick_time">Kies een tijd</string> <string name="shortcut_pick_time">Kies een tijd</string>
<string name="no_time">Geen tijd</string> <string name="no_time">Geen tijd</string>
<string name="no_date">Geen datum</string> <string name="no_date">Geen datum</string>

@ -567,7 +567,6 @@
<string name="desaturate_colors">Desaturuj kolory</string> <string name="desaturate_colors">Desaturuj kolory</string>
<string name="desaturate_colors_summary_on">Kolory będą desaturowane w ciemnych motywach</string> <string name="desaturate_colors_summary_on">Kolory będą desaturowane w ciemnych motywach</string>
<string name="desaturate_colors_summary_off">Kolory nie będą desaturowane w ciemnych motywach</string> <string name="desaturate_colors_summary_off">Kolory nie będą desaturowane w ciemnych motywach</string>
<string name="shortcut_pick_date">Wybierz datę</string>
<string name="shortcut_pick_time">Wybierz czas</string> <string name="shortcut_pick_time">Wybierz czas</string>
<string name="no_time">Brak czasu</string> <string name="no_time">Brak czasu</string>
<string name="no_date">Brak daty</string> <string name="no_date">Brak daty</string>

@ -573,7 +573,6 @@
<string name="desaturate_colors">Уменьшить насыщенность цветов</string> <string name="desaturate_colors">Уменьшить насыщенность цветов</string>
<string name="desaturate_colors_summary_on">Цвета будут менее насыщенными в темных темах</string> <string name="desaturate_colors_summary_on">Цвета будут менее насыщенными в темных темах</string>
<string name="desaturate_colors_summary_off">Цвета не будут менее насыщенными в темных темах</string> <string name="desaturate_colors_summary_off">Цвета не будут менее насыщенными в темных темах</string>
<string name="shortcut_pick_date">Выбрать дату</string>
<string name="shortcut_pick_time">Выбрать время</string> <string name="shortcut_pick_time">Выбрать время</string>
<string name="no_time">Без времени</string> <string name="no_time">Без времени</string>
<string name="no_date">Без даты</string> <string name="no_date">Без даты</string>

@ -567,7 +567,6 @@
<string name="shortcut_pick_time">Zaman seç</string> <string name="shortcut_pick_time">Zaman seç</string>
<string name="no_time">Zaman yok</string> <string name="no_time">Zaman yok</string>
<string name="calendar_event_created">%s için takvim olayı oluşturuldu</string> <string name="calendar_event_created">%s için takvim olayı oluşturuldu</string>
<string name="shortcut_pick_date">Tarih seç</string>
<string name="no_date">Tarih yok</string> <string name="no_date">Tarih yok</string>
<string name="chip_appearance_icon_only">Yalnızca simge</string> <string name="chip_appearance_icon_only">Yalnızca simge</string>
<string name="chip_appearance_text_only">Yalnızca metin</string> <string name="chip_appearance_text_only">Yalnızca metin</string>

@ -559,7 +559,6 @@
<string name="calendar_event_created">В календарі створено подію для %s</string> <string name="calendar_event_created">В календарі створено подію для %s</string>
<string name="auto_dismiss_datetime_summary">Закривати вибір дати та часу після встановлення дати чи часу</string> <string name="auto_dismiss_datetime_summary">Закривати вибір дати та часу після встановлення дати чи часу</string>
<string name="auto_dismiss_datetime">Автоматично закривати вибір дати та часу</string> <string name="auto_dismiss_datetime">Автоматично закривати вибір дати та часу</string>
<string name="shortcut_pick_date">Оберіть дату</string>
<string name="shortcut_pick_time">Оберіть час</string> <string name="shortcut_pick_time">Оберіть час</string>
<string name="no_time">Без часу</string> <string name="no_time">Без часу</string>
<string name="no_date">Без дати</string> <string name="no_date">Без дати</string>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="calendar_view_visible">0</integer> <!-- View.VISIBLE -->
</resources>

@ -555,7 +555,6 @@
<string name="add_place">添加地点</string> <string name="add_place">添加地点</string>
<string name="auto_dismiss_datetime_summary">在选择一个日期或时间后关闭日期时间选择器</string> <string name="auto_dismiss_datetime_summary">在选择一个日期或时间后关闭日期时间选择器</string>
<string name="auto_dismiss_datetime">自动关闭日期时间选择器</string> <string name="auto_dismiss_datetime">自动关闭日期时间选择器</string>
<string name="shortcut_pick_date">挑选日期</string>
<string name="shortcut_pick_time">挑选时间</string> <string name="shortcut_pick_time">挑选时间</string>
<string name="no_time">无时间</string> <string name="no_time">无时间</string>
<string name="no_date">无日期</string> <string name="no_date">无日期</string>

@ -7,5 +7,4 @@
<integer name="default_afternoon">46800000</integer> <!-- 13:00 --> <integer name="default_afternoon">46800000</integer> <!-- 13:00 -->
<integer name="default_evening">61200000</integer> <!-- 17:00 --> <integer name="default_evening">61200000</integer> <!-- 17:00 -->
<integer name="default_night">72000000</integer> <!-- 20:00 --> <integer name="default_night">72000000</integer> <!-- 20:00 -->
<integer name="calendar_view_visible">2</integer> <!-- View.GONE -->
</resources> </resources>

@ -586,7 +586,6 @@ File %1$s contained %2$s.\n\n
<string name="no_date">No date</string> <string name="no_date">No date</string>
<string name="no_time">No time</string> <string name="no_time">No time</string>
<string name="shortcut_pick_time">Pick time</string> <string name="shortcut_pick_time">Pick time</string>
<string name="shortcut_pick_date">Pick date</string>
<string name="auto_dismiss_datetime">Autoclose date time picker</string> <string name="auto_dismiss_datetime">Autoclose date time picker</string>
<string name="auto_dismiss_datetime_list">Task list</string> <string name="auto_dismiss_datetime_list">Task list</string>
<string name="auto_dismiss_datetime_list_summary">Autoclose when picking from task list</string> <string name="auto_dismiss_datetime_list_summary">Autoclose when picking from task list</string>

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

Loading…
Cancel
Save