[UI] Migrate MaterialDialogs to material-components.

This commit is contained in:
Kuba Szczodrzyński 2021-03-30 15:26:52 +02:00
parent 4469323fe0
commit 37c0ff2ac7
15 changed files with 414 additions and 319 deletions

View File

@ -134,8 +134,6 @@ dependencies {
// Other dependencies // Other dependencies
implementation "cat.ereza:customactivityoncrash:2.3.0" implementation "cat.ereza:customactivityoncrash:2.3.0"
implementation "com.afollestad.material-dialogs:commons:0.9.6.0"
implementation "com.afollestad.material-dialogs:core:0.9.6.0"
implementation "com.applandeo:material-calendar-view:1.5.0" implementation "com.applandeo:material-calendar-view:1.5.0"
implementation "com.daimajia.swipelayout:library:1.2.0@aar" implementation "com.daimajia.swipelayout:library:1.2.0@aar"
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2" implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2"

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) Kuba Szczodrzyński 2021-3-30.
*/
package pl.szczodrzynski.edziennik.ui.dialogs
import android.text.InputType
import android.view.LayoutInflater
import androidx.core.view.isVisible
import androidx.core.widget.addTextChangedListener
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputEditText
import pl.szczodrzynski.edziennik.databinding.DialogEditTextBinding
import pl.szczodrzynski.edziennik.isNotNullNorBlank
fun MaterialAlertDialogBuilder.input(
message: CharSequence? = null,
type: Int = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE,
hint: CharSequence? = null,
value: CharSequence? = null,
changeListener: ((editText: TextInputEditText, input: String) -> Boolean)? = null,
positiveButton: Int? = null,
positiveListener: ((editText: TextInputEditText, input: String) -> Boolean)? = null
): MaterialAlertDialogBuilder {
val b = DialogEditTextBinding.inflate(LayoutInflater.from(context), null, false)
b.title.text = message
b.title.isVisible = message.isNotNullNorBlank()
b.text1.hint = hint
b.text1.inputType = type
b.text1.setText(value)
b.text1.addTextChangedListener { text ->
if (changeListener?.invoke(b.text1, text?.toString() ?: "") != false)
b.text1.error = null
}
if (positiveButton != null) {
setPositiveButton(positiveButton) { dialog, _ ->
if (positiveListener?.invoke(b.text1, b.text1.text?.toString() ?: "") != false)
dialog.dismiss()
}
}
setView(b.root)
return this
}

View File

@ -5,12 +5,11 @@
package pl.szczodrzynski.edziennik.ui.dialogs.home package pl.szczodrzynski.edziennik.ui.dialogs.home
import android.text.InputType import android.text.InputType
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder
import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.entity.Profile import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.ui.dialogs.input
class StudentNumberDialog( class StudentNumberDialog(
val activity: AppCompatActivity, val activity: AppCompatActivity,
@ -22,25 +21,27 @@ class StudentNumberDialog(
private const val TAG = "StudentNumberDialog" private const val TAG = "StudentNumberDialog"
} }
private lateinit var dialog: AlertDialog
init { run { init { run {
if (activity.isFinishing) if (activity.isFinishing)
return@run return@run
onShowListener?.invoke(TAG) onShowListener?.invoke(TAG)
MaterialDialog.Builder(activity) MaterialAlertDialogBuilder(activity)
.title(R.string.card_lucky_number_set_title) .setTitle(R.string.card_lucky_number_set_title)
.content(R.string.card_lucky_number_set_text) .input(
.inputType(InputType.TYPE_CLASS_NUMBER) message = activity.getString(R.string.card_lucky_number_set_text),
.input(null, if (profile.studentNumber == -1) "" else profile.studentNumber.toString()) { _: MaterialDialog?, input: CharSequence -> type = InputType.TYPE_CLASS_NUMBER,
try { hint = null,
profile.studentNumber = input.toString().toInt() value = if (profile.studentNumber == -1) null else profile.studentNumber.toString(),
} catch (e: Exception) { positiveButton = R.string.ok,
Toast.makeText(activity, R.string.incorrect_format, Toast.LENGTH_SHORT).show() positiveListener = { _, input ->
} profile.studentNumber = input.toIntOrNull() ?: -1
true
} }
.dismissListener { )
onDismissListener?.invoke(TAG) .setNegativeButton(R.string.cancel, null)
}.show() .setOnDismissListener {
onDismissListener?.invoke(TAG)
}
.show()
}} }}
} }

View File

@ -14,7 +14,7 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.afollestad.materialdialogs.MaterialDialog; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial; import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
@ -161,12 +161,12 @@ public class AnnouncementsFragment extends Fragment {
} }
private void showAnnouncementDetailsDialog(AnnouncementFull announcement) { private void showAnnouncementDetailsDialog(AnnouncementFull announcement) {
MaterialDialog dialog = new MaterialDialog.Builder(activity) DialogAnnouncementBinding b = DialogAnnouncementBinding.inflate(LayoutInflater.from(activity), null, false);
.title(announcement.getSubject()) new MaterialAlertDialogBuilder(activity)
.customView(R.layout.dialog_announcement, true) .setTitle(announcement.getSubject())
.positiveText(R.string.ok) .setView(b.getRoot())
.setPositiveButton(R.string.ok, null)
.show(); .show();
DialogAnnouncementBinding b = DialogAnnouncementBinding.bind(dialog.getCustomView());
b.text.setText(announcement.getTeacherName() +"\n\n"+ (announcement.getStartDate() != null ? announcement.getStartDate().getFormattedString() : "-") + (announcement.getEndDate() != null ? " do " + announcement.getEndDate().getFormattedString() : "")+"\n\n" +announcement.getText()); b.text.setText(announcement.getTeacherName() +"\n\n"+ (announcement.getStartDate() != null ? announcement.getStartDate().getFormattedString() : "-") + (announcement.getEndDate() != null ? " do " + announcement.getEndDate().getFormattedString() : "")+"\n\n" +announcement.getText());
if (!announcement.getSeen() && app.getProfile().getLoginStoreType() != LOGIN_TYPE_LIBRUS) { if (!announcement.getSeen() && app.getProfile().getLoginStoreType() != LOGIN_TYPE_LIBRUS) {
announcement.setSeen(true); announcement.setSeen(true);

View File

@ -12,7 +12,7 @@ import android.widget.Button
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import cat.ereza.customactivityoncrash.CustomActivityOnCrash import cat.ereza.customactivityoncrash.CustomActivityOnCrash
import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.* import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.BuildConfig import pl.szczodrzynski.edziennik.BuildConfig
@ -87,15 +87,13 @@ class CrashActivity : AppCompatActivity(), CoroutineScope {
} }
val moreInfoButton = findViewById<Button>(R.id.crash_details_btn) val moreInfoButton = findViewById<Button>(R.id.crash_details_btn)
moreInfoButton.setOnClickListener { v: View? -> moreInfoButton.setOnClickListener {
MaterialDialog.Builder(this@CrashActivity) MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialogMonospace)
.title(R.string.crash_details) .setTitle(R.string.crash_details)
.content(Html.fromHtml(getErrorString(intent, false))) .setMessage(Html.fromHtml(getErrorString(intent, false)))
.typeface(null, "RobotoMono-Regular.ttf") .setPositiveButton(R.string.close, null)
.positiveText(R.string.close) .setNeutralButton(R.string.copy_to_clipboard) { _, _ -> copyErrorToClipboard() }
.neutralText(R.string.copy_to_clipboard) .show()
.onNeutral { _, _ -> copyErrorToClipboard() }
.show()
} }
val errorInformation = CustomActivityOnCrash.getAllErrorDetailsFromIntent(this@CrashActivity, intent) val errorInformation = CustomActivityOnCrash.getAllErrorDetailsFromIntent(this@CrashActivity, intent)

View File

@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.afollestad.materialdialogs.MaterialDialog; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputEditText;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.yuyh.jsonviewer.library.JsonRecyclerView; import com.yuyh.jsonviewer.library.JsonRecyclerView;
@ -211,10 +211,10 @@ public class DebugFragment extends Fragment {
mRecyclerView.bindJson(result); mRecyclerView.bindJson(result);
} }
catch (Exception e) { catch (Exception e) {
new MaterialDialog.Builder(getActivity()) new MaterialAlertDialogBuilder(getActivity(), R.style.AppTheme_MaterialAlertDialogMonospace)
.title("Result") .setTitle("Result")
.content(result) .setMessage(result)
.positiveText(R.string.ok) .setPositiveButton(R.string.ok, null)
.show(); .show();
} }
mRecyclerView.setTextSize(20); mRecyclerView.setTextSize(20);

View File

@ -10,7 +10,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.gson.* import com.google.gson.*
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -18,6 +18,7 @@ import kotlinx.coroutines.Job
import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.databinding.TemplateListPageFragmentBinding import pl.szczodrzynski.edziennik.databinding.TemplateListPageFragmentBinding
import pl.szczodrzynski.edziennik.ui.dialogs.input
import pl.szczodrzynski.edziennik.ui.modules.base.lazypager.LazyFragment import pl.szczodrzynski.edziennik.ui.modules.base.lazypager.LazyFragment
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -87,51 +88,55 @@ class LabProfileFragment : LazyFragment(), CoroutineScope {
else -> objVal.toString() else -> objVal.toString()
} }
MaterialDialog.Builder(activity) MaterialAlertDialogBuilder(activity)
.input("value", value, false) { _, input -> .setTitle(item.key)
val input = input.toString() .input(
when (parent) { hint = "value",
is JsonObject -> { value = value,
val v = objVal as JsonPrimitive positiveButton = R.string.ok,
when { positiveListener = { _, input ->
v.isString -> (parent as JsonObject)[objName] = input when (parent) {
v.isNumber -> (parent as JsonObject)[objName] = input.toLong() is JsonObject -> {
v.isBoolean -> (parent as JsonObject)[objName] = input.toBoolean() val v = objVal as JsonPrimitive
when {
v.isString -> (parent as JsonObject)[objName] = input
v.isNumber -> (parent as JsonObject)[objName] = input.toLong()
v.isBoolean -> (parent as JsonObject)[objName] = input.toBoolean()
}
}
is JsonArray -> {
}
is HashMap<*, *> -> app.config.set(objName, input)
else -> {
val field = parent::class.java.getDeclaredField(objName)
field.isAccessible = true
val newVal = when (objVal) {
is Int -> input.toInt()
is Boolean -> input.toBoolean()
is Float -> input.toFloat()
is Char -> input.toCharArray()[0]
is String -> input
is Long -> input.toLong()
is Double -> input.toDouble()
else -> input
}
field.set(parent, newVal)
} }
} }
is JsonArray -> {
when (item.key.substringBefore(":")) {
"App.profile" -> app.profileSave()
"App.profile.studentData" -> app.profileSave()
"App.profile.loginStore" -> app.db.loginStoreDao().add(loginStore)
} }
is HashMap<*, *> -> app.config.set(objName, input)
else -> { showJson()
val field = parent::class.java.getDeclaredField(objName)
field.isAccessible = true return@input true
val newVal = when (objVal) {
is Int -> input.toInt()
is Boolean -> input.toBoolean()
is Float -> input.toFloat()
is Char -> input.toCharArray()[0]
is String -> input
is Long -> input.toLong()
is Double -> input.toDouble()
else -> input
}
field.set(parent, newVal)
}
} }
)
when (item.key.substringBefore(":")) { .setNegativeButton(R.string.cancel, null)
"App.profile" -> app.profileSave()
"App.profile.studentData" -> app.profileSave()
"App.profile.loginStore" -> app.db.loginStoreDao().add(loginStore)
}
showJson()
}
.title(item.key)
.positiveText(R.string.ok)
.negativeText(R.string.cancel)
.show() .show()
} }
catch (e: Exception) { catch (e: Exception) {

View File

@ -11,10 +11,11 @@ import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder
import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Grade import pl.szczodrzynski.edziennik.data.db.entity.Grade
import pl.szczodrzynski.edziennik.databinding.FragmentGradesEditorBinding import pl.szczodrzynski.edziennik.databinding.FragmentGradesEditorBinding
import pl.szczodrzynski.edziennik.ui.dialogs.input
import pl.szczodrzynski.edziennik.utils.Colors import pl.szczodrzynski.edziennik.utils.Colors
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_AVG import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_AVG
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM
@ -72,12 +73,11 @@ class GradesEditorFragment : Fragment() {
semester = arguments.getInt("semester", 1) semester = arguments.getInt("semester", 1)
if (subjectId == -1L) { if (subjectId == -1L) {
MaterialDialog.Builder(activity) MaterialAlertDialogBuilder(activity)
.title(R.string.error_occured) .setTitle(R.string.error_occured)
.content(R.string.error_no_subject_id) .setMessage(R.string.error_no_subject_id)
.positiveText(R.string.ok) .setPositiveButton(R.string.ok) { _, _ -> activity.navigateUp() }
.onPositive { _, _ -> activity.navigateUp() } .show()
.show()
return return
} }
@ -193,12 +193,11 @@ class GradesEditorFragment : Fragment() {
app.db.subjectDao().getById(App.profileId, subjectId).observe(this, Observer { subject -> app.db.subjectDao().getById(App.profileId, subjectId).observe(this, Observer { subject ->
if (subject == null || subject.id == -1L) { if (subject == null || subject.id == -1L) {
MaterialDialog.Builder(activity) MaterialAlertDialogBuilder(activity)
.title(R.string.error_occured) .setTitle(R.string.error_occured)
.content(R.string.error_no_subject_id) .setMessage(R.string.error_no_subject_id)
.positiveText(R.string.ok) .setPositiveButton(R.string.ok) { _, _ -> activity.navigateUp() }
.onPositive { _, _ -> activity.navigateUp() } .show()
.show()
return@Observer return@Observer
} }
@ -329,21 +328,24 @@ class GradesEditorFragment : Fragment() {
popup.setOnMenuItemClickListener { item -> popup.setOnMenuItemClickListener { item ->
if (item.itemId == 100) { if (item.itemId == 100) {
MaterialDialog.Builder(v.context) MaterialAlertDialogBuilder(v.context)
.title(R.string.grades_editor_add_grade_title) .setTitle(R.string.grades_editor_add_grade_title)
.content(R.string.grades_editor_add_grade_weight) .input(
.inputType(InputType.TYPE_NUMBER_FLAG_SIGNED) message = v.context.getString(R.string.grades_editor_add_grade_weight),
.input(null, null) { _, input -> type = InputType.TYPE_NUMBER_FLAG_SIGNED,
positiveButton = R.string.ok,
positiveListener = { _, input ->
try { try {
editorGrade.weight = input.toString().toFloat() editorGrade.weight = input.toFloat()
callback() callback()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
true
} }
.positiveText(R.string.ok) )
.negativeText(R.string.cancel) .setNegativeButton(R.string.cancel, null)
.show() .show()
} else { } else {
editorGrade.weight = item.itemId.toFloat() editorGrade.weight = item.itemId.toFloat()
callback() callback()

View File

@ -9,12 +9,13 @@ import android.content.ContextWrapper
import android.text.InputType import android.text.InputType
import android.util.AttributeSet import android.util.AttributeSet
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.crc16 import pl.szczodrzynski.edziennik.crc16
import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.ui.dialogs.input
import pl.szczodrzynski.edziennik.utils.TextInputDropDown import pl.szczodrzynski.edziennik.utils.TextInputDropDown
class SubjectDropdown : TextInputDropDown { class SubjectDropdown : TextInputDropDown {
@ -105,19 +106,25 @@ class SubjectDropdown : TextInputDropDown {
fun customNameDialog() { fun customNameDialog() {
activity ?: return activity ?: return
MaterialDialog.Builder(activity!!) MaterialAlertDialogBuilder(activity!!)
.title("Własny przedmiot") .setTitle("Własny przedmiot")
.inputType(InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE) .input(
.input("Nazwa", "") { _: MaterialDialog?, input: CharSequence -> hint = "Nazwa",
customSubjectName = input.toString() type = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
positiveButton = R.string.ok,
positiveListener = { _, input ->
customSubjectName = input
select(Item( select(Item(
-1L * customSubjectName.crc16(), -1L * customSubjectName.crc16(),
customSubjectName, customSubjectName,
tag = customSubjectName tag = customSubjectName
)) ))
onCustomSubjectSelected?.invoke(customSubjectName) onCustomSubjectSelected?.invoke(customSubjectName)
true
} }
.show() )
.setNegativeButton(R.string.cancel, null)
.show()
} }
fun selectSubject(subjectId: Long) { fun selectSubject(subjectId: Long) {

View File

@ -8,17 +8,18 @@ import android.app.Activity;
import android.app.WallpaperManager; import android.app.WallpaperManager;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.database.DataSetObserver;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.SeekBar; import android.widget.SeekBar;
import com.afollestad.materialdialogs.MaterialDialog; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.afollestad.materialdialogs.simplelist.MaterialSimpleListAdapter;
import com.afollestad.materialdialogs.simplelist.MaterialSimpleListItem;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import java.util.List; import java.util.List;
@ -27,6 +28,7 @@ import pl.szczodrzynski.edziennik.App;
import pl.szczodrzynski.edziennik.R; import pl.szczodrzynski.edziennik.R;
import pl.szczodrzynski.edziennik.data.db.entity.Profile; import pl.szczodrzynski.edziennik.data.db.entity.Profile;
import pl.szczodrzynski.edziennik.databinding.DialogWidgetConfigBinding; import pl.szczodrzynski.edziennik.databinding.DialogWidgetConfigBinding;
import pl.szczodrzynski.edziennik.databinding.WidgetProfileDialogItemBinding;
import pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider; import pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider;
import pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider; import pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider;
import pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider; import pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider;
@ -96,45 +98,84 @@ public class WidgetConfigActivity extends Activity {
} }
private void selectProfile() { private void selectProfile() {
MaterialSimpleListAdapter adapter = if (profileList.size() > 1 && widgetType != WIDGET_LUCKY_NUMBER) {
new MaterialSimpleListAdapter((dialog, index1, item) -> { profileList.add(
profileId = (int) item.getId(); new Profile(-1,
profileName = item.toString(); 0,
0,
getString(R.string.widget_config_all_profiles),
null,
"",
"",
null,
new JsonObject()
)
);
}
ListAdapter adapter = new ListAdapter() {
@Override public boolean areAllItemsEnabled() { return true; }
@Override public boolean isEnabled(int position) { return true; }
@Override public void registerDataSetObserver(DataSetObserver observer) { }
@Override public void unregisterDataSetObserver(DataSetObserver observer) { }
@Override public boolean hasStableIds() { return true; }
@Override public int getItemViewType(int position) { return 0; }
@Override public int getViewTypeCount() { return 1; }
@Override public boolean isEmpty() { return false; }
@Override public int getCount() { return profileList.size(); }
@Override public Object getItem(int position) { return profileList.get(position); }
@Override
public long getItemId(int position) {
return profileList.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
WidgetProfileDialogItemBinding b;
if (convertView == null) {
b = WidgetProfileDialogItemBinding.inflate(getLayoutInflater(), null, false);
}
else {
b = WidgetProfileDialogItemBinding.bind(convertView);
}
Profile profile = profileList.get(position);
b.name.setText(profile.getName());
b.subname.setText(profile.getSubname());
b.subname.setVisibility(profile.getSubname() == null ? View.GONE : View.VISIBLE);
b.image.setVisibility(profile.getId() == -1 ? View.GONE : View.VISIBLE);
if (profile.getId() == -1)
b.image.setImageDrawable(null);
else
b.image.setImageDrawable(profile.getImageDrawable(WidgetConfigActivity.this));
b.getRoot().setOnClickListener(v -> {
profileId = profile.getId();
profileName = profile.getName();
configure(); configure();
}); });
for (Profile profile : profileList) { return b.getRoot();
adapter.add( }
new MaterialSimpleListItem.Builder(this) };
.id(profile.getId())
.content(profile.getName()) new MaterialAlertDialogBuilder(this)
.icon(profile.getImageDrawable(this)) .setTitle(R.string.choose_profile)
.backgroundColor(Color.WHITE) .setAdapter(adapter, null)
.build()); .setOnDismissListener(dialog -> finish())
}
if (profileList.size() > 1 && widgetType != WIDGET_LUCKY_NUMBER) {
adapter.add(
new MaterialSimpleListItem.Builder(this)
.id(-1)
.content(R.string.widget_config_all_profiles)
.backgroundColor(Color.WHITE)
.build());
}
new MaterialDialog.Builder(this)
.title(R.string.choose_profile)
.adapter(adapter, null)
.dismissListener(dialog -> finish())
.show(); .show();
} }
private void configure() { private void configure() {
MaterialDialog dialog = new MaterialDialog.Builder(this) b = DialogWidgetConfigBinding.inflate(getLayoutInflater(), null, false);
.title(R.string.widget_config_activity_customize)
.customView(R.layout.dialog_widget_config, true) new MaterialAlertDialogBuilder(this)
.dismissListener(dialog1 -> finish()) .setTitle(R.string.widget_config_activity_customize)
.positiveText(R.string.ok) .setView(b.getRoot())
.negativeText(R.string.cancel) .setOnDismissListener(dialog -> finish())
.onPositive(((dialog1, which) -> { .setPositiveButton(R.string.ok, ((dialog, which) -> {
WidgetConfig config = new WidgetConfig(profileId, bigStyle, darkTheme, opacity); WidgetConfig config = new WidgetConfig(profileId, bigStyle, darkTheme, opacity);
JsonObject configs = app.getConfig().getWidgetConfigs(); JsonObject configs = app.getConfig().getWidgetConfigs();
configs.add(Integer.toString(mAppWidgetId), app.getGson().toJsonTree(config)); configs.add(Integer.toString(mAppWidgetId), app.getGson().toJsonTree(config));
@ -165,10 +206,9 @@ public class WidgetConfigActivity extends Activity {
setResult(RESULT_OK, resultValue); setResult(RESULT_OK, resultValue);
finish(); finish();
})) }))
.setNegativeButton(R.string.cancel, null)
.show(); .show();
b = DialogWidgetConfigBinding.bind(dialog.getCustomView());
b.setProfileName(profileName); b.setProfileName(profileName);
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);

View File

@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_height="match_parent"> android:orientation="vertical"
android:padding="24dp">
<TextView <TextView
android:id="@+id/text" android:id="@+id/text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:autoLink="web|email" android:autoLink="web|email"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" /> android:textSize="16sp" />
</LinearLayout> </ScrollView>
</layout>

View File

@ -2,122 +2,129 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<data> <data>
<import type="android.view.View" /> <import type="android.view.View" />
<variable <variable
name="profileName" name="profileName"
type="String" /> type="String" />
</data> </data>
<LinearLayout
android:orientation="vertical" <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <LinearLayout
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:padding="24dp">
android:textAppearance="@style/NavView.TextView.Helper"
android:visibility="@{profileName == null ? View.GONE : View.VISIBLE}"
android:text="@string/dialog_widget_config_profile" />
<TextView <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:text="@{profileName}"
android:textIsSelectable="true"
android:visibility="@{profileName == null ? View.GONE : View.VISIBLE}"
tools:text="Władca Androida" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textAppearance="@style/NavView.TextView.Helper"
android:text="@string/dialog_widget_timetable_config_theme" />
<RadioGroup
android:id="@+id/theme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/themeLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="@string/theme_light" />
<RadioButton
android:id="@+id/themeDark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/theme_dark" />
</RadioGroup>
<CheckBox
android:id="@+id/bigStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/dialog_widget_timetable_config_big_style" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textAppearance="@style/NavView.TextView.Helper"
android:text="@string/dialog_widget_timetable_config_opacity" />
<SeekBar
android:id="@+id/opacity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="100" />
<TextView
android:id="@+id/opacityText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:textIsSelectable="true"
android:gravity="end"
tools:text="100%" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/wallpaper"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="@+id/widgetPreview"
app:layout_constraintEnd_toEndOf="@+id/widgetPreview"
app:layout_constraintStart_toStartOf="@+id/widgetPreview"
app:layout_constraintTop_toTopOf="@+id/widgetPreview"
tools:srcCompat="@tools:sample/backgrounds/scenic[4]"
tools:visibility="visible" />
<ImageView
android:id="@+id/widgetPreview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:textAppearance="@style/NavView.TextView.Helper"
android:padding="32dp" android:visibility="@{profileName == null ? View.GONE : View.VISIBLE}"
app:layout_constraintEnd_toEndOf="parent" android:text="@string/dialog_widget_config_profile" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/widget_timetable_preview" />
</androidx.constraintlayout.widget.ConstraintLayout> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:text="@{profileName}"
android:textIsSelectable="true"
android:visibility="@{profileName == null ? View.GONE : View.VISIBLE}"
tools:text="Władca Androida" />
</LinearLayout> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textAppearance="@style/NavView.TextView.Helper"
android:text="@string/dialog_widget_timetable_config_theme" />
<RadioGroup
android:id="@+id/theme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/themeLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="@string/theme_light" />
<RadioButton
android:id="@+id/themeDark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/theme_dark" />
</RadioGroup>
<CheckBox
android:id="@+id/bigStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/dialog_widget_timetable_config_big_style" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textAppearance="@style/NavView.TextView.Helper"
android:text="@string/dialog_widget_timetable_config_opacity" />
<SeekBar
android:id="@+id/opacity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="100" />
<TextView
android:id="@+id/opacityText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:textIsSelectable="true"
android:gravity="end"
tools:text="100%" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/wallpaper"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="@+id/widgetPreview"
app:layout_constraintEnd_toEndOf="@+id/widgetPreview"
app:layout_constraintStart_toStartOf="@+id/widgetPreview"
app:layout_constraintTop_toTopOf="@+id/widgetPreview"
tools:srcCompat="@tools:sample/backgrounds/scenic[4]"
tools:visibility="visible" />
<ImageView
android:id="@+id/widgetPreview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/widget_timetable_preview" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</ScrollView>
</layout> </layout>

View File

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:ignore="PrivateResource"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:focusable="true"
android:gravity="start|center_vertical"
android:minHeight="@dimen/md_simpleitem_height"
android:orientation="horizontal"
android:paddingHorizontal="@dimen/md_dialog_frame_margin">
<androidx.cardview.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/md_simplelist_icon_margin"
android:layout_marginRight="@dimen/md_simplelist_icon_margin"
android:innerRadius="0dp"
android:padding="0dp"
app:cardCornerRadius="20dp"
app:cardElevation="4dp">
<ImageView
android:id="@android:id/icon"
android:layout_width="@dimen/md_simplelist_icon"
android:layout_height="@dimen/md_simplelist_icon"
android:layout_gravity="start|center_vertical"
android:background="@drawable/gray_circle"
android:scaleType="centerCrop"
tools:background="#f5f5f5"
tools:ignore="ContentDescription"
tools:srcCompat="@tools:sample/backgrounds/scenic" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="@dimen/md_simplelist_textsize"
tools:text="Title" />
</LinearLayout>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:focusable="true"
android:gravity="center_vertical"
android:minHeight="62dp"
android:orientation="horizontal"
android:paddingHorizontal="24dp">
<com.mikepenz.materialdrawer.view.BezelImageView
android:id="@+id/image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:scaleType="centerCrop"
tools:ignore="ContentDescription"
tools:srcCompat="@tools:sample/backgrounds/scenic" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Medium"
tools:text="Title" />
<TextView
android:id="@+id/subname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Small"
tools:text="SubTitle" />
</LinearLayout>
</LinearLayout>

View File

@ -87,6 +87,12 @@
<item name="textColor">?android:textColorSecondary</item> <item name="textColor">?android:textColorSecondary</item>
<item name="android:textColor">?android:textColorSecondary</item> <item name="android:textColor">?android:textColorSecondary</item>
</style> </style>
<style name="AppTheme.MaterialAlertDialogMonospace" parent="AppTheme.MaterialAlertDialog">
<item name="materialAlertDialogBodyTextStyle">@style/AppTheme.MaterialAlertDialogMonospace.BodyText</item>
</style>
<style name="AppTheme.MaterialAlertDialogMonospace.BodyText" parent="AppTheme.MaterialAlertDialog.BodyText">
<item name="android:typeface">monospace</item>
</style>
<style name="AppTheme" parent="NavView" /> <style name="AppTheme" parent="NavView" />
@ -104,12 +110,6 @@
<item name="colorOnFab">#ffffff</item> <item name="colorOnFab">#ffffff</item>
<item name="colorIcon">#8a000000</item> <item name="colorIcon">#8a000000</item>
<item name="md_dark_theme">false</item>
<item name="md_title_color">?android:textColorPrimary</item>
<item name="md_content_color">?android:textColorPrimary</item>
<item name="md_link_color">?colorAccent</item>
<item name="md_item_color">?android:textColorPrimary</item>
<item name="mal_color_primary">?android:textColorPrimary</item> <item name="mal_color_primary">?android:textColorPrimary</item>
<item name="mal_color_secondary">?android:textColorSecondary</item> <item name="mal_color_secondary">?android:textColorSecondary</item>
<item name="mal_card_background">?colorSurface</item> <item name="mal_card_background">?colorSurface</item>
@ -136,12 +136,6 @@
<item name="colorOnFab">#ffffff</item> <item name="colorOnFab">#ffffff</item>
<item name="colorIcon">#b4ffffff</item> <item name="colorIcon">#b4ffffff</item>
<item name="md_dark_theme">true</item>
<item name="md_title_color">?android:textColorPrimary</item>
<item name="md_content_color">?android:textColorPrimary</item>
<item name="md_link_color">?colorAccent</item>
<item name="md_item_color">?android:textColorPrimary</item>
<item name="mal_color_primary">@color/primaryTextDark</item> <item name="mal_color_primary">@color/primaryTextDark</item>
<item name="mal_color_secondary">@color/secondaryTextDark</item> <item name="mal_color_secondary">@color/secondaryTextDark</item>
<item name="mal_card_background">?colorSurface</item> <item name="mal_card_background">?colorSurface</item>