diff --git a/.idea/misc.xml b/.idea/misc.xml index e91075f..54f95cb 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -17,7 +17,14 @@ + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 854b0df..9ea7fbc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.SchoolGuide"> + { + boolean contains = sharedPreferences.contains(key); + if (!contains) return; + + switch (key) { + case KEY_IS_DEVELOPER_FEATURES: + settings.isDeveloperFeatures = sharedPreferences.getBoolean(key, false); + break; + + case KEY_IS_BUILTIN_PRESET_LIST: + settings.isBuiltInPresetList = sharedPreferences.getBoolean(key, false); + AutoGlobalUpdateService.update(app); + break; + + case KEY_IS_SHOW_EMPTY_NOTIFICATION: + settings.isStopForegroundIsNone = !sharedPreferences.getBoolean(key, false); + break; + } + app.saveSettings(); + app.getPresetListUpdateCallbacks().run((callbackStorage, callback) -> callback.onPresetListUpdate()); + }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + app = SchoolGuideApp.get(this); if (app == null) { setContentView(SharedConstrains.getAppNullView(this)); @@ -34,63 +64,40 @@ protected void onCreate(Bundle savedInstanceState) { } settings = app.getSettings(); - binding = SettingsActivityBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); + setContentView(R.layout.activity_settings); + setTitle(R.string.settings_activityTitle); + + if (savedInstanceState == null) { + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new SettingsFragment()) + .commit(); + } else { + Toast.makeText(this, "Error", Toast.LENGTH_LONG).show(); + finish(); + return; + } - setActualState(settings); - setCallbacks(); - } + preferences = PreferenceManager.getDefaultSharedPreferences(this); + preferences.edit() + .putBoolean(KEY_IS_SHOW_EMPTY_NOTIFICATION, !settings.isStopForegroundIsNone) + .putBoolean(KEY_IS_DEVELOPER_FEATURES, settings.isDeveloperFeatures) + .putBoolean(KEY_IS_BUILTIN_PRESET_LIST, settings.isBuiltInPresetList) + .apply(); - private void setActualState(Settings settings) { - binding.developerFeatures.setChecked(settings.developerFeatures); - binding.stopForegroundIsNone.setChecked(settings.stopForegroundIsNone); - binding.isFirstMonday.setChecked(settings.isFirstMonday); - binding.syncGlobalPresetList.setChecked(settings.globalPresetListSync); + preferences.registerOnSharedPreferenceChangeListener(listener); } - private void setCallbacks() { - binding.developerFeatures.setOnCheckedChangeListener((buttonView, isChecked) -> { - settings.developerFeatures = isChecked; - save(); - }); - - binding.stopForegroundIsNone.setOnCheckedChangeListener((buttonView, isChecked) -> { - settings.stopForegroundIsNone = isChecked; - save(); - }); - - binding.isFirstMonday.setOnCheckedChangeListener((buttonView, isChecked) -> { - settings.isFirstMonday = isChecked; - save(); - }); - - binding.syncGlobalPresetList.setOnCheckedChangeListener((buttonView, isChecked) -> { - settings.globalPresetListSync = isChecked; - save(); - }); - - binding.changeScheduleNotifyBeforeTime.setOnClickListener(v -> { - EditText editText = new EditText(this); - editText.setText(String.valueOf(settings.scheduleNotifyBeforeTime)); - - new AlertDialog.Builder(this) - .setView(editText) - .setPositiveButton("APPLY", (ig, ign) -> { - try { - settings.scheduleNotifyBeforeTime = Integer.parseInt(editText.getText().toString()); - } catch (Exception e) { - app.getAppTrace().point("changeScheduleNotifyBeforeTimeDialog", e); - Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show(); - } - save(); - }) - .show(); - }); + @Override + protected void onDestroy() { + super.onDestroy(); + preferences.unregisterOnSharedPreferenceChangeListener(listener); } - private void save() { - app.saveSettings(); - Snackbar snackbar = Snackbar.make(binding.getRoot(), "Saved!", Snackbar.LENGTH_SHORT); - snackbar.show(); + public static class SettingsFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.settings_preferences, rootKey); + } } } \ No newline at end of file diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/AppBuiltinSchedule.java b/app/src/main/java/ru/fazziclay/schoolguide/app/AppBuiltinSchedule.java deleted file mode 100644 index 93ce449..0000000 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/AppBuiltinSchedule.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.fazziclay.schoolguide.app; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class AppBuiltinSchedule { - public List selectedAutoSyncPresets = new ArrayList<>(); -} diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/SchoolGuideApp.java b/app/src/main/java/ru/fazziclay/schoolguide/app/SchoolGuideApp.java index a12061b..6d94f8b 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/SchoolGuideApp.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/SchoolGuideApp.java @@ -16,9 +16,11 @@ import java.util.List; import ru.fazziclay.schoolguide.SharedConstrains; +import ru.fazziclay.schoolguide.app.listener.GlobalUpdateListener; import ru.fazziclay.schoolguide.app.global.AutoGlobalUpdateService; import ru.fazziclay.schoolguide.app.global.GlobalBuiltinPresetList; import ru.fazziclay.schoolguide.app.global.GlobalVersionManifest; +import ru.fazziclay.schoolguide.app.listener.PresetListUpdateListener; import ru.fazziclay.schoolguide.app.scheduleinformator.ScheduleInformatorApp; import ru.fazziclay.schoolguide.callback.CallbackImportance; import ru.fazziclay.schoolguide.callback.CallbackStorage; @@ -156,6 +158,8 @@ public static SchoolGuideApp get() { * **/ private final CallbackStorage globalUpdateCallbacks = new CallbackStorage<>(); + private final CallbackStorage presetListUpdateCallbacks = new CallbackStorage<>(); + public SchoolGuideApp(Context context) { if (context == null) { @@ -320,4 +324,8 @@ public void setGlobalBuiltinPresetList(GlobalBuiltinPresetList globalBuiltinPres public CallbackStorage getGlobalUpdateCallbacks() { return globalUpdateCallbacks; } + + public CallbackStorage getPresetListUpdateCallbacks() { + return presetListUpdateCallbacks; + } } diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/Settings.java b/app/src/main/java/ru/fazziclay/schoolguide/app/Settings.java index ff849a6..ecc6670 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/Settings.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/Settings.java @@ -3,11 +3,11 @@ import ru.fazziclay.schoolguide.app.scheduleinformator.android.PresetEditActivity; public class Settings { - public boolean developerFeatures = false; + public boolean isDeveloperFeatures = false; public int scheduleNotifyBeforeTime = 2*60*60; - public boolean stopForegroundIsNone = true; + public boolean isStopForegroundIsNone = true; public boolean isFirstMonday = true; public PresetEditActivity.ColorScheme presetEditColorScheme = PresetEditActivity.ColorScheme.DEFAULT; - public boolean globalPresetListSync = false; + public boolean isBuiltInPresetList = false; } diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/global/AutoGlobalUpdateService.java b/app/src/main/java/ru/fazziclay/schoolguide/app/global/AutoGlobalUpdateService.java index cc98172..736b9c3 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/global/AutoGlobalUpdateService.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/global/AutoGlobalUpdateService.java @@ -11,11 +11,10 @@ import ru.fazziclay.schoolguide.SharedConstrains; import ru.fazziclay.schoolguide.app.SchoolGuideApp; import ru.fazziclay.schoolguide.callback.CallbackStorage; -import ru.fazziclay.schoolguide.app.GlobalUpdateListener; +import ru.fazziclay.schoolguide.app.listener.GlobalUpdateListener; public class AutoGlobalUpdateService extends Service { private SchoolGuideApp app; - private CallbackStorage callbacks; private Handler handler; private Runnable runnable; @@ -29,21 +28,10 @@ public void onCreate() { stopSelf(); return; } - callbacks = app.getGlobalUpdateCallbacks(); handler = new Handler(getMainLooper()); runnable = () -> { - GlobalManager.get(app, new GlobalManager.GlobalManagerInterface() { - @Override - public void failed(Exception exception) {} - - @Override - public void success(GlobalKeys keys, GlobalVersionManifest versionManifest, GlobalBuiltinPresetList builtinSchedule) { - app.setGlobalVersionManifest(versionManifest); - app.setGlobalBuiltinPresetList(builtinSchedule); - callbacks.run((callbackStorage, callback) -> callback.onGlobalUpdate(keys, versionManifest, builtinSchedule)); - } - }); + update(app); handler.postDelayed(runnable, 60 * 60 * 1000); }; } @@ -58,4 +46,18 @@ public int onStartCommand(Intent intent, int flags, int startId) { public IBinder onBind(Intent intent) { return null; } + + public static void update(SchoolGuideApp app) { + GlobalManager.get(app, new GlobalManager.GlobalManagerInterface() { + @Override + public void failed(Exception exception) {} + + @Override + public void success(GlobalKeys keys, GlobalVersionManifest versionManifest, GlobalBuiltinPresetList builtinSchedule) { + app.setGlobalVersionManifest(versionManifest); + app.setGlobalBuiltinPresetList(builtinSchedule); + app.getGlobalUpdateCallbacks().run((callbackStorage, callback) -> callback.onGlobalUpdate(keys, versionManifest, builtinSchedule)); + } + }); + } } \ No newline at end of file diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/GlobalUpdateListener.java b/app/src/main/java/ru/fazziclay/schoolguide/app/listener/GlobalUpdateListener.java similarity index 91% rename from app/src/main/java/ru/fazziclay/schoolguide/app/GlobalUpdateListener.java rename to app/src/main/java/ru/fazziclay/schoolguide/app/listener/GlobalUpdateListener.java index a2522a6..65c8aca 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/GlobalUpdateListener.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/listener/GlobalUpdateListener.java @@ -1,4 +1,4 @@ -package ru.fazziclay.schoolguide.app; +package ru.fazziclay.schoolguide.app.listener; import ru.fazziclay.schoolguide.app.global.GlobalBuiltinPresetList; import ru.fazziclay.schoolguide.app.global.GlobalKeys; diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/listener/PresetListUpdateListener.java b/app/src/main/java/ru/fazziclay/schoolguide/app/listener/PresetListUpdateListener.java new file mode 100644 index 0000000..0adfe2e --- /dev/null +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/listener/PresetListUpdateListener.java @@ -0,0 +1,8 @@ +package ru.fazziclay.schoolguide.app.listener; + +import ru.fazziclay.schoolguide.callback.Callback; +import ru.fazziclay.schoolguide.callback.Status; + +public interface PresetListUpdateListener extends Callback { + Status onPresetListUpdate(); +} diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/ScheduleInformatorApp.java b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/ScheduleInformatorApp.java index becf87b..8e52542 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/ScheduleInformatorApp.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/ScheduleInformatorApp.java @@ -29,7 +29,7 @@ public class ScheduleInformatorApp { public static final String NOTIFICATION_CHANNEL_ID_NOW = "scheduleinformator_now"; public static final int NOTIFICATION_ID = 1000; - public Notification notification; + private Notification notification; private final SchoolGuideApp app; private final AppTrace appTrace; @@ -42,7 +42,7 @@ public class ScheduleInformatorApp { private final AppPresetList schedule; private InformatorService informatorService = null; - boolean isServiceForeground = false; + private boolean isServiceForeground = false; public ScheduleInformatorApp(SchoolGuideApp app) { this.app = app; @@ -59,23 +59,22 @@ public ScheduleInformatorApp(SchoolGuideApp app) { saveAppSchedule(); app.getGlobalUpdateCallbacks().addCallback(CallbackImportance.DEFAULT, (globalKeys, globalVersionManifest, globalBuiltinPresetList) -> { - if (globalBuiltinPresetList != null && settings.globalPresetListSync && globalBuiltinPresetList.presets != null) { + if (globalBuiltinPresetList != null && globalBuiltinPresetList.presets != null) { int i = 0; while (i < globalBuiltinPresetList.getPresetsIds().length) { UUID gPresetUUID = globalBuiltinPresetList.getPresetsIds()[i]; Preset gPreset = globalBuiltinPresetList.getPreset(gPresetUUID); - if (gPreset == null) { + if (gPreset == null || !settings.isBuiltInPresetList) { schedule.removePreset(gPresetUUID); } else { - gPreset.syncedByGlobal = true; + gPreset.setSyncedByGlobal(true); schedule.putPreset(gPresetUUID, gPreset); } i++; } - schedule.presets = globalBuiltinPresetList.presets; saveAppSchedule(); } return new Status.Builder().build(); @@ -115,7 +114,7 @@ public int tick() { boolean isNext = nextEvent != null; if (!isNow && !isNext) { - if (settings.stopForegroundIsNone) { + if (settings.isStopForegroundIsNone) { stopForeground(); } else { startForeground(); @@ -126,7 +125,7 @@ public int tick() { } if (!isNow && nextEvent.remainsUntilStart() > settings.scheduleNotifyBeforeTime) { - if (settings.stopForegroundIsNone) { + if (settings.isStopForegroundIsNone) { stopForeground(); } else { startForeground(); @@ -142,15 +141,15 @@ public int tick() { notificationBuilder.smallIcon = R.drawable.planner_s; if (isNow) { - String title = context.getString(R.string.scheduleInformator_now_title); - String message = context.getString(R.string.scheduleInformator_now_next_text); + String title = context.getString(R.string.scheduleInformator_notification_now_title); + String message = context.getString(R.string.scheduleInformator_notification_now_next_text); notificationBuilder.contentTitle = String.format(title, nowEvent.getName(), TimeUtil.convertToHumanTime(nowEvent.remainsUntilEnd(), ConvertMode.hhMMSS)); if (isNext) notificationBuilder.contentText = String.format(message, nextEvent.getName()); } else { - String title = context.getString(R.string.scheduleInformator_next_title); - String message = context.getString(R.string.scheduleInformator_next_text); + String title = context.getString(R.string.scheduleInformator_notification_next_title); + String message = context.getString(R.string.scheduleInformator_notification_next_text); notificationBuilder.contentTitle = String.format(title, TimeUtil.convertToHumanTime(nextEvent.remainsUntilStart(), ConvertMode.hhMMSS)); notificationBuilder.contentText = String.format(message, nextEvent.getName()); } @@ -184,8 +183,8 @@ public void sendNotify() { } public Notification getNoneNotification() { - String title = context.getString(R.string.scheduleInformator_none_title); - String message = context.getString(R.string.scheduleInformator_none_text); + String title = context.getString(R.string.scheduleInformator_notification_none_title); + String message = context.getString(R.string.scheduleInformator_notification_none_text); return new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID_NONE) .setSmallIcon(R.drawable.planner_s) .setAutoCancel(true) diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetEditActivity.java b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetEditActivity.java index 9aa2736..5bac67b 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetEditActivity.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetEditActivity.java @@ -87,9 +87,8 @@ protected void onCreate(Bundle savedInstanceState) { binding = ActivityPresetEditBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - // TODO: 2022-01-29 return - setTitle(String.format("synced=%s deleted=%s", preset.syncedByGlobal, preset.deletedInGlobal)); - //setTitle(getString(R.string.presetEdit_activityTitle, preset.getName())); + //setTitle(String.format("synced=%s deleted=%s", preset.syncedByGlobal, preset.deletedInGlobal)); + setTitle(getString(R.string.presetEdit_activityTitle, preset.getName())); updateEventList(); } diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetListActivity.java b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetListActivity.java index 7d87f94..7f346fc 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetListActivity.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/android/PresetListActivity.java @@ -4,12 +4,14 @@ import android.content.Context; import android.content.Intent; import android.graphics.Color; +import android.graphics.Typeface; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.provider.Settings; import android.text.InputFilter; +import android.text.SpannableString; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -36,8 +38,9 @@ import ru.fazziclay.schoolguide.SettingsActivity; import ru.fazziclay.schoolguide.SharedConstrains; import ru.fazziclay.schoolguide.UpdateCenterActivity; -import ru.fazziclay.schoolguide.app.GlobalUpdateListener; +import ru.fazziclay.schoolguide.app.listener.GlobalUpdateListener; import ru.fazziclay.schoolguide.app.SchoolGuideApp; +import ru.fazziclay.schoolguide.app.listener.PresetListUpdateListener; import ru.fazziclay.schoolguide.app.multiplicationtrening.MathTreningGameActivity; import ru.fazziclay.schoolguide.app.scheduleinformator.ScheduleInformatorApp; import ru.fazziclay.schoolguide.app.scheduleinformator.SelectablePresetList; @@ -46,6 +49,7 @@ import ru.fazziclay.schoolguide.callback.CallbackImportance; import ru.fazziclay.schoolguide.callback.Status; import ru.fazziclay.schoolguide.databinding.ActivityPresetListBinding; +import ru.fazziclay.schoolguide.util.ColorUtil; public class PresetListActivity extends AppCompatActivity { public static final int PRESET_NAME_MAX_LENGTH = 25; @@ -59,10 +63,12 @@ public static Intent getLaunchIntent(Context context) { private ScheduleInformatorApp informatorApp; private ActivityPresetListBinding binding; private MenuItem openUpdateCenterMenuItem; + private MenuItem openDebugItem; private PresetList presetList; private GlobalUpdateListener globalUpdateListener; + private PresetListUpdateListener presetListUpdateListener; @Override protected void onCreate(Bundle savedInstanceState) { @@ -89,7 +95,24 @@ protected void onCreate(Bundle savedInstanceState) { .setDeleteCallback(activityClosed) .build(); }; + + presetListUpdateListener = () -> { + boolean activityClosed = isFinishing(); + + try { + if (!activityClosed) { + runOnUiThread(this::updateList); + } + } catch (Exception ignored) {} + + + return new Status.Builder() + .setDeleteCallback(activityClosed) + .build(); + }; + app.getGlobalUpdateCallbacks().addCallback(CallbackImportance.LOW, globalUpdateListener); + app.getPresetListUpdateCallbacks().addCallback(CallbackImportance.LOW, presetListUpdateListener); binding = ActivityPresetListBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); @@ -107,19 +130,23 @@ protected void onResume() { } updateOpenUpdateCenterMenuName(); updateList(); + if (openDebugItem != null) { + openDebugItem.setVisible(app.getSettings().isDeveloperFeatures); + } } @Override protected void onDestroy() { super.onDestroy(); app.getGlobalUpdateCallbacks().deleteCallback(globalUpdateListener); + app.getPresetListUpdateCallbacks().deleteCallback(presetListUpdateListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); - menu.findItem(R.id.openDebugItem).setVisible(app.getSettings().developerFeatures); openUpdateCenterMenuItem = menu.findItem(R.id.openUpdateCenterItem); + openDebugItem = menu.findItem(R.id.openDebugItem); updateOpenUpdateCenterMenuName(); return true; } @@ -127,7 +154,7 @@ public boolean onCreateOptionsMenu(Menu menu) { private void updateOpenUpdateCenterMenuName() { if (openUpdateCenterMenuItem == null) return; if (app.isUpdateAvailable()) { - openUpdateCenterMenuItem.setTitle(String.format("(!) %s", getString(R.string.mainOptionMenu_openUpdateCenter))); + openUpdateCenterMenuItem.setTitle(ColorUtil.colorize(getString(R.string.mainOptionMenu_openUpdateCenter_available), Color.RED, Color.TRANSPARENT, Typeface.BOLD)); } else { openUpdateCenterMenuItem.setTitle(R.string.mainOptionMenu_openUpdateCenter); } @@ -148,9 +175,6 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { } else if (id == R.id.openDebugItem) { startActivity(DebugActivity.getLaunchIntent(this)); - } else if (id == R.id.openBuiltInPresetList) { - // TODO: 2/1/22 add - } return true; } @@ -208,7 +232,7 @@ private void showCreateNewPresetDialog() { .setPositiveButton(R.string.presetList_createNew_create, (dialogInterface, which) -> { String newName = name.getText().toString(); if (newName.isEmpty()) { - Toast.makeText(this, R.string.presetList_presetNameIsEmptyError, Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.presetList_exception_presetNameEmpty, Toast.LENGTH_SHORT).show(); return; } presetList.addPreset(new Preset(newName)); @@ -285,10 +309,11 @@ private void showCopyPresetDialog(UUID uuid) { .setPositiveButton(R.string.presetList_copy, (e, e1) -> { String newName = name.getText().toString(); if (newName.isEmpty()) { - Toast.makeText(this, R.string.presetList_presetNameIsEmptyError, Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.presetList_exception_presetNameEmpty, Toast.LENGTH_SHORT).show(); return; } Preset newPreset = preset.clone(); + newPreset.setSyncedByGlobal(false); newPreset.setName(newName); presetList.addPreset(newPreset); informatorApp.saveAppSchedule(); @@ -332,7 +357,7 @@ private void showRenamePresetDialog(UUID uuid) { .setPositiveButton(R.string.presetList_rename, (e, e1) -> { String newName = name.getText().toString(); if (newName.isEmpty()) { - Toast.makeText(this, R.string.presetList_presetNameIsEmptyError, Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.presetList_exception_presetNameEmpty, Toast.LENGTH_SHORT).show(); return; } preset.setName(newName); @@ -412,6 +437,7 @@ public View getView(int position, View convertView, ViewGroup parent) { * Получить View элемента списка * **/ private View getPresetView(UUID presetUUID, Preset preset) { + boolean isGlobal = preset.isSyncedByGlobal(); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.HORIZONTAL); @@ -430,6 +456,7 @@ private View getPresetView(UUID presetUUID, Preset preset) { }); TextView textView = new TextView(this); + textView.setTextColor(isGlobal ? Color.parseColor("#ffff0000") : Color.parseColor("#ffffffff")); PopupMenu popupMenu = new PopupMenu(this, textView); popupMenu.inflate(R.menu.menu_preset_list_popup); popupMenu.setOnMenuItemClickListener(item -> { @@ -445,9 +472,17 @@ private View getPresetView(UUID presetUUID, Preset preset) { informatorApp.saveAppSchedule(); return true; }); - textView.setText(preset == null ? "(null)" : preset.getName()); + popupMenu.getMenu().findItem(R.id.delete).setEnabled(!isGlobal); + popupMenu.getMenu().findItem(R.id.rename).setEnabled(!isGlobal); + + String textR = preset == null ? "(null)" : preset.getName(); + SpannableString string = new SpannableString(textR); + if (preset != null) { + if (isGlobal) string = ColorUtil.colorize(textR, Color.parseColor("#ffaaaaaa"), Color.TRANSPARENT, Typeface.ITALIC); + } + textView.setText(string); textView.setTextSize(30); - textView.setTextColor(Color.WHITE); + //textView.setTextColor(Color.WHITE); textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); textView.setOnClickListener(view -> startActivity(PresetEditActivity.getLaunchIntent(this, presetUUID))); textView.setOnLongClickListener(v -> { diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/Preset.java b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/Preset.java index b92772c..879592c 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/Preset.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/Preset.java @@ -10,12 +10,10 @@ import ru.fazziclay.schoolguide.util.time.TimeUtil; public class Preset implements Cloneable { - String name; - String author; + private String name; + private String author; - // TODO: 2022-01-28 make private - public boolean deletedInGlobal = false; - public boolean syncedByGlobal = false; + private boolean syncedByGlobal = false; public HashMap eventsInfos = new HashMap<>(); public List eventsPositions = new ArrayList<>(); @@ -65,6 +63,16 @@ public CompressedEvent compressEvent(Event event) { return CompressedEvent.create(event, getEventInfo(event.getEventInfo())); } + @NonNull + public Preset clone() { + try { + return (Preset) super.clone(); + } catch (CloneNotSupportedException exception) { + exception.printStackTrace(); + return null; + } + } + public EventInfo getEventInfo(UUID uuid) { return eventsInfos.get(uuid); } @@ -85,13 +93,11 @@ public String getAuthor() { return author; } - @NonNull - public Preset clone() { - try { - return (Preset) super.clone(); - } catch (CloneNotSupportedException exception) { - exception.printStackTrace(); - return null; - } + public boolean isSyncedByGlobal() { + return syncedByGlobal; + } + + public void setSyncedByGlobal(boolean syncedByGlobal) { + this.syncedByGlobal = syncedByGlobal; } } diff --git a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/PresetList.java b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/PresetList.java index 05908d7..6e805ab 100644 --- a/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/PresetList.java +++ b/app/src/main/java/ru/fazziclay/schoolguide/app/scheduleinformator/appschedule/PresetList.java @@ -44,14 +44,14 @@ public UUID[] getPresetsIds() { UUID[] ids = presets.keySet().toArray(new UUID[0]); SortUtil.sort(ids, uuid -> { Preset preset = getPreset(uuid); - return preset.name; + return preset.getName(); }); return ids; } public Preset[] getPresets() { Preset[] presets = this.presets.values().toArray(new Preset[0]); - SortUtil.sort(presets, preset -> preset.name); + SortUtil.sort(presets, Preset::getName); return presets; } diff --git a/app/src/main/res/layout/activity_preset_edit.xml b/app/src/main/res/layout/activity_preset_edit.xml index 12937bb..31ccc74 100644 --- a/app/src/main/res/layout/activity_preset_edit.xml +++ b/app/src/main/res/layout/activity_preset_edit.xml @@ -31,6 +31,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/ic_input_add" + android:visibility="gone" android:contentDescription="@string/presetEdit_addEvent_contentDescription" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_preset_list.xml b/app/src/main/res/layout/activity_preset_list.xml index aad3e19..ff75fef 100644 --- a/app/src/main/res/layout/activity_preset_list.xml +++ b/app/src/main/res/layout/activity_preset_list.xml @@ -24,7 +24,7 @@ android:textSize="31sp" android:gravity="center" android:textColor="#ffffff" - android:text="@string/presetList_empty_title" /> + android:text="@string/presetList_emptyMessage_title" /> + android:text="@string/presetList_emptyMessage_message" /> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 0000000..ab55623 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml deleted file mode 100644 index 1f9a3b7..0000000 --- a/app/src/main/res/layout/settings_activity.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -