├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── android.yml ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── Contributor.md ├── LICENSE ├── Privacy.md ├── README.en.md ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules-acra.pro ├── proguard-rules-debug.pro ├── proguard-rules-guava.pro ├── proguard-rules.pro └── src │ ├── androidTest │ ├── assets │ │ └── test-data-ok.zip │ └── java │ │ └── ryey │ │ └── easer │ │ ├── ApplicationTest.java │ │ ├── core │ │ ├── EHServiceTest.kt │ │ └── data │ │ │ └── HelperTest.java │ │ └── skills │ │ ├── TestHelper.java │ │ ├── condition │ │ └── ringer_mode │ │ │ └── RingerModeConditionDataTest.java │ │ ├── event │ │ ├── broadcast │ │ │ └── BroadcastEventDataTest.java │ │ ├── condition_event │ │ │ └── ConditionEventEventDataTest.java │ │ ├── nfc_tag │ │ │ └── NfcTagEventDataTest.java │ │ ├── notification │ │ │ └── NotificationEventDataTest.java │ │ ├── sms │ │ │ └── SmsEventDataTest.java │ │ ├── tcp_trip │ │ │ └── TcpTripEventDataTest.java │ │ ├── timer │ │ │ └── TimerEventDataTest.java │ │ └── widget │ │ │ └── WidgetEventDataTest.java │ │ ├── operation │ │ ├── airplane_mode │ │ │ └── AirplaneModeOperationDataTest.java │ │ ├── alarm │ │ │ └── AlarmOperationDataTest.java │ │ ├── bluetooth │ │ │ └── BluetoothOperationDataTest.java │ │ ├── bluetooth_connect │ │ │ └── BluetoothConnectOperationDataTest.java │ │ ├── brightness │ │ │ └── BrightnessOperationDataTest.java │ │ ├── cellular │ │ │ └── CellularOperationDataTest.java │ │ ├── command │ │ │ └── CommandOperationDataTest.java │ │ ├── hotspot │ │ │ └── HotspotOperationDataTest.java │ │ ├── http_request │ │ │ └── HttpRequestOperationDataTest.java │ │ ├── intent │ │ │ └── IntentOperationDataTest.java │ │ ├── launch_app │ │ │ └── LaunchAppOperationDataTest.java │ │ ├── media_control │ │ │ └── MediaControlOperationDataTest.java │ │ ├── network_transmission │ │ │ └── NetworkTransmissionOperationDataTest.java │ │ ├── play_media │ │ │ └── PlayMediaOperationDataTest.java │ │ ├── ringer_mode │ │ │ └── RingerModeOperationDataTest.java │ │ ├── rotation │ │ │ └── RotationOperationDataTest.java │ │ ├── send_notification │ │ │ └── SendNotificationOperationDataTest.java │ │ ├── send_sms │ │ │ └── SmsOperationDataTest.java │ │ ├── state_control │ │ │ └── StateControlOperationDataTest.java │ │ ├── synchronization │ │ │ └── SynchronizationOperationDataTest.java │ │ ├── toast │ │ │ └── ToastOperationDataTest.java │ │ ├── ui_mode │ │ │ └── UiModeOperationDataTest.java │ │ ├── volume │ │ │ └── VolumeOperationDataTest.java │ │ ├── wifi │ │ │ └── WifiOperationDataTest.java │ │ └── wireguard │ │ │ └── WireguardOperationDataTest.java │ │ └── usource │ │ ├── battery_level │ │ └── BatteryLevelUSourceDataTest.java │ │ ├── bluetooth_device │ │ └── BTDeviceUSourceDataTest.java │ │ ├── bluetooth_enabled │ │ └── BluetoothEnabledUSourceDataTest.java │ │ ├── calendar │ │ └── CalendarUSourceDataTest.java │ │ ├── call │ │ └── CallUSourceDataTest.java │ │ ├── cell_location │ │ └── CellLocationUSourceDataTest.java │ │ ├── connectivity │ │ └── ConnectivityEventDataTest.java │ │ ├── date │ │ └── DateUSourceDataTest.java │ │ ├── day_of_week │ │ └── DayOfWeekUSourceDataTest.java │ │ ├── headset │ │ └── HeadsetUSourceDataTest.java │ │ ├── location │ │ └── LocationUSourceDataTest.java │ │ ├── power │ │ └── PowerUSourceDataTest.java │ │ ├── screen │ │ └── ScreenUSourceDataTest.java │ │ ├── time │ │ └── TimeUSourceDataTest.java │ │ ├── wifi │ │ └── WifiUSourceDataTest.java │ │ └── wifi_enabled │ │ └── WifiEnabledUSourceDataTest.java │ ├── beta │ └── res │ │ └── values │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ │ └── ryey │ │ │ └── easer │ │ │ ├── EaserApplication.java │ │ │ ├── ErrorSender.kt │ │ │ ├── ErrorSenderFactory.kt │ │ │ ├── SettingsUtils.java │ │ │ ├── Utils.java │ │ │ ├── commons │ │ │ ├── C.java │ │ │ ├── CommonSkillUtils.java │ │ │ ├── DelayedJob.java │ │ │ ├── ImproperImplementationError.java │ │ │ ├── UnexpectedBehaviourError.java │ │ │ ├── local_skill │ │ │ │ ├── DataFactory.java │ │ │ │ ├── IllegalStorageDataException.java │ │ │ │ ├── InvalidDataInputException.java │ │ │ │ ├── Reused.java │ │ │ │ ├── Skill.java │ │ │ │ ├── SkillView.java │ │ │ │ ├── SourceCategory.java │ │ │ │ ├── StorageData.java │ │ │ │ ├── ValidData.java │ │ │ │ ├── conditionskill │ │ │ │ │ ├── ConditionData.java │ │ │ │ │ ├── ConditionDataFactory.java │ │ │ │ │ ├── ConditionSkill.java │ │ │ │ │ └── Tracker.java │ │ │ │ ├── dynamics │ │ │ │ │ ├── Dynamics.java │ │ │ │ │ ├── DynamicsLink.java │ │ │ │ │ └── SolidDynamicsAssignment.java │ │ │ │ ├── eventskill │ │ │ │ │ ├── EventData.java │ │ │ │ │ ├── EventDataFactory.java │ │ │ │ │ ├── EventSkill.java │ │ │ │ │ └── Slot.java │ │ │ │ ├── operationskill │ │ │ │ │ ├── Loader.java │ │ │ │ │ ├── OperationData.java │ │ │ │ │ ├── OperationDataFactory.java │ │ │ │ │ ├── OperationSkill.java │ │ │ │ │ └── PrivilegeUsage.java │ │ │ │ └── usource │ │ │ │ │ ├── USourceData.java │ │ │ │ │ ├── USourceDataFactory.java │ │ │ │ │ └── USourceSkill.java │ │ │ └── ui │ │ │ │ ├── CommonBaseActivity.kt │ │ │ │ ├── DataSelectSpinnerWrapper.java │ │ │ │ └── ExplainedTextInput.kt │ │ │ ├── core │ │ │ ├── AsyncHelper.java │ │ │ ├── BootUpReceiver.java │ │ │ ├── ConditionHolderService.java │ │ │ ├── ConditionLotus.java │ │ │ ├── CoreServiceComponents.java │ │ │ ├── DataSavingFailedException.kt │ │ │ ├── EHService.java │ │ │ ├── EaserStatusWidget.kt │ │ │ ├── EventLotus.java │ │ │ ├── ItemBeingUsedException.kt │ │ │ ├── Lotus.java │ │ │ ├── ProfileLoaderService.java │ │ │ ├── RemoteOperationPluginInfo.kt │ │ │ ├── RemotePluginCommunicationHelper.java │ │ │ ├── RemotePluginInfo.kt │ │ │ ├── RemotePluginRegistryService.kt │ │ │ ├── ServiceUtils.kt │ │ │ ├── SkillHelper.java │ │ │ ├── UpgradeCompleteReceiver.java │ │ │ ├── data │ │ │ │ ├── BuilderInfoClashedException.java │ │ │ │ ├── ConditionStructure.java │ │ │ │ ├── EventStructure.java │ │ │ │ ├── Helper.java │ │ │ │ ├── InvalidExportedDataException.java │ │ │ │ ├── LogicGraph.java │ │ │ │ ├── Named.java │ │ │ │ ├── ProfileStructure.java │ │ │ │ ├── RemoteLocalOperationDataWrapper.java │ │ │ │ ├── Renameable.java │ │ │ │ ├── ScriptStructure.java │ │ │ │ ├── Verifiable.java │ │ │ │ ├── WithCreatedVersion.java │ │ │ │ └── storage │ │ │ │ │ ├── AbstractDataStorage.java │ │ │ │ │ ├── C.java │ │ │ │ │ ├── ConditionDataStorage.java │ │ │ │ │ ├── EventDataStorage.java │ │ │ │ │ ├── ProfileDataStorage.java │ │ │ │ │ ├── RequiredDataNotFoundException.java │ │ │ │ │ ├── ScriptDataStorage.java │ │ │ │ │ ├── StorageHelper.java │ │ │ │ │ └── backend │ │ │ │ │ ├── ConditionDataStorageBackendInterface.java │ │ │ │ │ ├── DataStorageBackendCommonInterface.java │ │ │ │ │ ├── EventDataStorageBackendInterface.java │ │ │ │ │ ├── FileDataStorageBackendHelper.java │ │ │ │ │ ├── IOUtils.java │ │ │ │ │ ├── Parser.java │ │ │ │ │ ├── ProfileDataStorageBackendInterface.java │ │ │ │ │ ├── ScriptDataStorageBackendInterface.java │ │ │ │ │ ├── Serializer.java │ │ │ │ │ ├── UnableToSerializeException.java │ │ │ │ │ └── json │ │ │ │ │ ├── NC.java │ │ │ │ │ ├── condition │ │ │ │ │ ├── ConditionParser.java │ │ │ │ │ ├── ConditionSerializer.java │ │ │ │ │ └── JsonConditionDataStorageBackend.java │ │ │ │ │ ├── event │ │ │ │ │ ├── EventParser.java │ │ │ │ │ ├── EventSerializer.java │ │ │ │ │ └── JsonEventDataStorageBackend.java │ │ │ │ │ ├── profile │ │ │ │ │ ├── JsonProfileDataStorageBackend.java │ │ │ │ │ ├── ProfileParser.java │ │ │ │ │ └── ProfileSerializer.java │ │ │ │ │ └── script │ │ │ │ │ ├── JsonScriptDataStorageBackend.java │ │ │ │ │ ├── ScriptParser.java │ │ │ │ │ └── ScriptSerializer.java │ │ │ ├── dynamics │ │ │ │ ├── CoreDynamics.java │ │ │ │ ├── CoreDynamicsInterface.java │ │ │ │ ├── DateDynamics.java │ │ │ │ ├── ProfileNameDynamics.java │ │ │ │ ├── ScriptNameDynamics.java │ │ │ │ └── TimeDynamics.java │ │ │ ├── log │ │ │ │ ├── ActivityLog.kt │ │ │ │ ├── ActivityLogService.kt │ │ │ │ ├── BasicLog.kt │ │ │ │ ├── ProfileLoadedLog.kt │ │ │ │ ├── ScriptSatisfactionLog.kt │ │ │ │ └── ServiceLog.kt │ │ │ └── ui │ │ │ │ ├── ActivityHistoryFragment.java │ │ │ │ ├── DataCollectionFragment.kt │ │ │ │ ├── MainActivity.java │ │ │ │ ├── OutlineFragment.java │ │ │ │ ├── PermissionOutlineFragment.java │ │ │ │ ├── PivotFragment.kt │ │ │ │ ├── data │ │ │ │ ├── AbstractDataListFragment.java │ │ │ │ ├── AbstractEditDataActivity.java │ │ │ │ ├── AbstractSkillDataFragment.java │ │ │ │ ├── DataListContainerFragment.java │ │ │ │ ├── DataListContainerInterface.java │ │ │ │ ├── DataListInterface.java │ │ │ │ ├── EditDataProto.java │ │ │ │ ├── EditSourceDataFragment.java │ │ │ │ ├── SkillViewContainerFragment.java │ │ │ │ ├── SourceSelectorDialogFragment.java │ │ │ │ ├── SourceSkillViewContainerFragment.java │ │ │ │ ├── SourceSkillViewPager.java │ │ │ │ ├── condition │ │ │ │ │ ├── ConditionListFragment.java │ │ │ │ │ ├── ConditionSelectorDialogFragment.java │ │ │ │ │ ├── ConditionSkillViewContainerFragment.java │ │ │ │ │ ├── EditConditionActivity.java │ │ │ │ │ └── EditConditionDataFragment.java │ │ │ │ ├── event │ │ │ │ │ ├── EditEventActivity.java │ │ │ │ │ ├── EditEventDataFragment.java │ │ │ │ │ ├── EventListFragment.java │ │ │ │ │ ├── EventSelectorDialogFragment.java │ │ │ │ │ └── EventSkillViewContainerFragment.java │ │ │ │ ├── profile │ │ │ │ │ ├── EditProfileActivity.java │ │ │ │ │ ├── OperationSelectorFragment.java │ │ │ │ │ ├── OperationSkillViewContainerFragment.java │ │ │ │ │ ├── ProfileListFragment.java │ │ │ │ │ └── RemoteOperationSkillViewContainerFragment.java │ │ │ │ └── script │ │ │ │ │ ├── EditScriptActivity.java │ │ │ │ │ ├── ListDynamicsActivity.java │ │ │ │ │ ├── PickPredecessorsDialogFragment.kt │ │ │ │ │ └── ScriptListFragment.java │ │ │ │ ├── setting │ │ │ │ ├── RemotePluginInfoPreference.java │ │ │ │ ├── SettingsActivity.java │ │ │ │ ├── SkillEnabledPreference.java │ │ │ │ └── SkillSettingsPreferenceFragment.java │ │ │ │ └── version_n_info │ │ │ │ ├── AboutActivity.kt │ │ │ │ ├── Info.kt │ │ │ │ ├── TextSlide.kt │ │ │ │ ├── Version.kt │ │ │ │ └── WelcomeActivity.kt │ │ │ └── skills │ │ │ ├── IllegalArgumentTypeException.java │ │ │ ├── LocalSkillRegistry.java │ │ │ ├── SkillUtils.java │ │ │ ├── SkillViewFragment.java │ │ │ ├── condition │ │ │ ├── SelfNotifiableSkeletonTracker.java │ │ │ ├── SkeletonTracker.java │ │ │ └── ringer_mode │ │ │ │ ├── RingerModeConditionData.java │ │ │ │ ├── RingerModeConditionDataFactory.java │ │ │ │ ├── RingerModeConditionSkill.java │ │ │ │ ├── RingerModeSkillViewFragment.java │ │ │ │ └── RingerModeTracker.java │ │ │ ├── event │ │ │ ├── AbstractEventData.java │ │ │ ├── AbstractSlot.java │ │ │ ├── SelfNotifiableSlot.java │ │ │ ├── broadcast │ │ │ │ ├── BroadcastConnSlot.java │ │ │ │ ├── BroadcastEventData.java │ │ │ │ ├── BroadcastEventDataFactory.java │ │ │ │ ├── BroadcastEventSkill.java │ │ │ │ ├── BroadcastSkillViewFragment.java │ │ │ │ └── ReceiverSideIntentData.java │ │ │ ├── condition_event │ │ │ │ ├── ConditionEventEventData.java │ │ │ │ ├── ConditionEventEventDataFactory.java │ │ │ │ ├── ConditionEventEventSkill.java │ │ │ │ ├── ConditionEventSkillViewFragment.java │ │ │ │ └── ConditionEventSlot.java │ │ │ ├── nfc_tag │ │ │ │ ├── NfcListenerActivity.java │ │ │ │ ├── NfcListenerService.java │ │ │ │ ├── NfcTagEventData.java │ │ │ │ ├── NfcTagEventDataFactory.java │ │ │ │ ├── NfcTagEventSkill.java │ │ │ │ ├── NfcTagSkillViewFragment.java │ │ │ │ ├── NfcTagSlot.java │ │ │ │ └── WaitForNfcActivity.java │ │ │ ├── notification │ │ │ │ ├── NotificationEventData.java │ │ │ │ ├── NotificationEventDataFactory.java │ │ │ │ ├── NotificationEventListenerService.java │ │ │ │ ├── NotificationEventSkill.java │ │ │ │ ├── NotificationSkillViewFragment.java │ │ │ │ └── NotificationSlot.java │ │ │ ├── sms │ │ │ │ ├── SmsConnSlot.java │ │ │ │ ├── SmsEventData.java │ │ │ │ ├── SmsEventDataFactory.java │ │ │ │ ├── SmsEventSkill.java │ │ │ │ ├── SmsInnerData.java │ │ │ │ └── SmsSkillViewFragment.java │ │ │ ├── tcp_trip │ │ │ │ ├── TcpTripEventData.java │ │ │ │ ├── TcpTripEventDataFactory.java │ │ │ │ ├── TcpTripEventSkill.java │ │ │ │ ├── TcpTripSkillViewFragment.java │ │ │ │ └── TcpTripSlot.java │ │ │ ├── timer │ │ │ │ ├── TimerEventData.java │ │ │ │ ├── TimerEventDataFactory.java │ │ │ │ ├── TimerEventSkill.java │ │ │ │ ├── TimerSkillViewFragment.java │ │ │ │ └── TimerSlot.java │ │ │ └── widget │ │ │ │ ├── UserActionWidget.kt │ │ │ │ ├── UserActionWidgetConfigureActivity.kt │ │ │ │ ├── WidgetEventData.java │ │ │ │ ├── WidgetEventDataFactory.java │ │ │ │ ├── WidgetEventSkill.java │ │ │ │ ├── WidgetSkillViewFragment.java │ │ │ │ └── WidgetSlot.java │ │ │ ├── operation │ │ │ ├── BooleanOperationData.java │ │ │ ├── DynamicsEnabledString.java │ │ │ ├── IntegerOperationData.java │ │ │ ├── OperationLoader.java │ │ │ ├── StringOperationData.java │ │ │ ├── SwitchSkillViewFragment.java │ │ │ ├── airplane_mode │ │ │ │ ├── AirplaneModeLoader.java │ │ │ │ ├── AirplaneModeOperationData.java │ │ │ │ ├── AirplaneModeOperationDataFactory.java │ │ │ │ ├── AirplaneModeOperationSkill.java │ │ │ │ └── AirplaneModeSkillViewFragment.java │ │ │ ├── alarm │ │ │ │ ├── AlarmLoader.java │ │ │ │ ├── AlarmOperationData.java │ │ │ │ ├── AlarmOperationDataFactory.java │ │ │ │ ├── AlarmOperationSkill.java │ │ │ │ └── AlarmSkillViewFragment.java │ │ │ ├── bluetooth │ │ │ │ ├── BluetoothLoader.java │ │ │ │ ├── BluetoothOperationData.java │ │ │ │ ├── BluetoothOperationDataFactory.java │ │ │ │ ├── BluetoothOperationSkill.java │ │ │ │ └── BluetoothSkillViewFragment.java │ │ │ ├── bluetooth_connect │ │ │ │ ├── BluetoothConnectLoader.java │ │ │ │ ├── BluetoothConnectOperationData.java │ │ │ │ ├── BluetoothConnectOperationDataFactory.java │ │ │ │ ├── BluetoothConnectOperationSkill.java │ │ │ │ ├── BluetoothConnectSkillViewFragment.java │ │ │ │ └── BluetoothRequester.java │ │ │ ├── brightness │ │ │ │ ├── BrightnessLoader.java │ │ │ │ ├── BrightnessOperationData.java │ │ │ │ ├── BrightnessOperationDataFactory.java │ │ │ │ ├── BrightnessOperationSkill.java │ │ │ │ ├── BrightnessSkillViewFragment.java │ │ │ │ └── DumbSettingBrightnessActivity.java │ │ │ ├── cellular │ │ │ │ ├── CellularLoader.java │ │ │ │ ├── CellularOperationData.java │ │ │ │ ├── CellularOperationDataFactory.java │ │ │ │ ├── CellularOperationSkill.java │ │ │ │ └── CellularSkillViewFragment.java │ │ │ ├── command │ │ │ │ ├── CommandLoader.java │ │ │ │ ├── CommandOperationData.java │ │ │ │ ├── CommandOperationDataFactory.java │ │ │ │ ├── CommandOperationSkill.java │ │ │ │ └── CommandSkillViewFragment.java │ │ │ ├── hotspot │ │ │ │ ├── HotspotHelper.java │ │ │ │ ├── HotspotLoader.java │ │ │ │ ├── HotspotOperationData.java │ │ │ │ ├── HotspotOperationDataFactory.java │ │ │ │ ├── HotspotOperationSkill.java │ │ │ │ └── HotspotSkillViewFragment.java │ │ │ ├── http_request │ │ │ │ ├── HttpRequestLoader.java │ │ │ │ ├── HttpRequestOperationData.java │ │ │ │ ├── HttpRequestOperationDataFactory.java │ │ │ │ ├── HttpRequestOperationSkill.java │ │ │ │ └── HttpRequestSkillViewFragment.java │ │ │ ├── intent │ │ │ │ ├── IntentData.java │ │ │ │ ├── IntentLoader.java │ │ │ │ ├── IntentOperationData.java │ │ │ │ ├── IntentOperationDataFactory.java │ │ │ │ ├── IntentOperationSkill.java │ │ │ │ ├── IntentSkillViewFragment.java │ │ │ │ └── operations │ │ │ │ │ ├── ActivityLoader.java │ │ │ │ │ ├── ActivityOperationSkill.java │ │ │ │ │ ├── BroadcastLoader.java │ │ │ │ │ ├── BroadcastOperationSkill.java │ │ │ │ │ ├── ServiceLoader.java │ │ │ │ │ └── ServiceOperationSkill.java │ │ │ ├── launch_app │ │ │ │ ├── LaunchAppLoader.java │ │ │ │ ├── LaunchAppOperationData.java │ │ │ │ ├── LaunchAppOperationDataFactory.java │ │ │ │ ├── LaunchAppOperationSkill.java │ │ │ │ └── LaunchAppSkillViewFragment.java │ │ │ ├── media_control │ │ │ │ ├── MediaControlHelperNotificationListenerService.java │ │ │ │ ├── MediaControlLoader.java │ │ │ │ ├── MediaControlOperationData.java │ │ │ │ ├── MediaControlOperationDataFactory.java │ │ │ │ ├── MediaControlOperationSkill.java │ │ │ │ └── MediaControlSkillViewFragment.java │ │ │ ├── network_transmission │ │ │ │ ├── NetworkTransmissionLoader.java │ │ │ │ ├── NetworkTransmissionOperationData.java │ │ │ │ ├── NetworkTransmissionOperationDataFactory.java │ │ │ │ ├── NetworkTransmissionOperationSkill.java │ │ │ │ └── NetworkTransmissionSkillViewFragment.java │ │ │ ├── play_media │ │ │ │ ├── PlayMediaLoader.java │ │ │ │ ├── PlayMediaOperationData.java │ │ │ │ ├── PlayMediaOperationDataFactory.java │ │ │ │ ├── PlayMediaOperationSkill.java │ │ │ │ └── PlayMediaSkillViewFragment.java │ │ │ ├── ringer_mode │ │ │ │ ├── InterruptionFilterSwitcherService.java │ │ │ │ ├── RingerMode.java │ │ │ │ ├── RingerModeLoader.java │ │ │ │ ├── RingerModeOperationData.java │ │ │ │ ├── RingerModeOperationDataFactory.java │ │ │ │ ├── RingerModeOperationSkill.java │ │ │ │ └── RingerModeSkillViewFragment.java │ │ │ ├── rotation │ │ │ │ ├── RotationLoader.java │ │ │ │ ├── RotationOperationData.java │ │ │ │ ├── RotationOperationDataFactory.java │ │ │ │ ├── RotationOperationSkill.java │ │ │ │ └── RotationSkillViewFragment.java │ │ │ ├── send_notification │ │ │ │ ├── SendNotificationLoader.java │ │ │ │ ├── SendNotificationOperationData.java │ │ │ │ ├── SendNotificationOperationDataFactory.java │ │ │ │ ├── SendNotificationOperationSkill.java │ │ │ │ └── SendNotificationSkillViewFragment.java │ │ │ ├── send_sms │ │ │ │ ├── SendSmsOperationDataFactory.java │ │ │ │ ├── SendSmsOperationSkill.java │ │ │ │ ├── SmsLoader.java │ │ │ │ ├── SmsOperationData.java │ │ │ │ └── SmsSkillViewFragment.java │ │ │ ├── state_control │ │ │ │ ├── StateControlDataFactory.java │ │ │ │ ├── StateControlLoader.java │ │ │ │ ├── StateControlOperationData.java │ │ │ │ ├── StateControlOperationSkill.java │ │ │ │ └── StateControlSkillViewFragment.java │ │ │ ├── synchronization │ │ │ │ ├── SynchronizationLoader.java │ │ │ │ ├── SynchronizationOperationData.java │ │ │ │ ├── SynchronizationOperationDataFactory.java │ │ │ │ ├── SynchronizationOperationSkill.java │ │ │ │ └── SynchronizationSkillViewFragment.java │ │ │ ├── toast │ │ │ │ ├── ToastLoader.java │ │ │ │ ├── ToastOperationData.java │ │ │ │ ├── ToastOperationDataFactory.java │ │ │ │ ├── ToastOperationSkill.java │ │ │ │ └── ToastSkillViewFragment.java │ │ │ ├── ui_mode │ │ │ │ ├── UiModeLoader.java │ │ │ │ ├── UiModeOperationData.java │ │ │ │ ├── UiModeOperationDataFactory.java │ │ │ │ ├── UiModeOperationSkill.java │ │ │ │ └── UiModeSkillViewFragment.java │ │ │ ├── volume │ │ │ │ ├── VolumeLoader.java │ │ │ │ ├── VolumeOperationData.java │ │ │ │ ├── VolumeOperationDataFactory.java │ │ │ │ ├── VolumeOperationSkill.java │ │ │ │ └── VolumeOperationSkillViewFragment.java │ │ │ ├── wifi │ │ │ │ ├── WifiLoader.java │ │ │ │ ├── WifiOperationData.java │ │ │ │ ├── WifiOperationDataFactory.java │ │ │ │ ├── WifiOperationSkill.java │ │ │ │ └── WifiSkillViewFragment.java │ │ │ └── wireguard │ │ │ │ ├── WireguardLoader.java │ │ │ │ ├── WireguardOperationData.java │ │ │ │ ├── WireguardOperationDataFactory.java │ │ │ │ ├── WireguardOperationSkill.java │ │ │ │ └── WireguardSkillViewFragment.java │ │ │ ├── reusable │ │ │ ├── BooleanData.java │ │ │ ├── EditExtraFragment.java │ │ │ ├── ExtraItem.java │ │ │ ├── Extras.java │ │ │ ├── IntegerData.java │ │ │ └── StringData.java │ │ │ └── usource │ │ │ ├── ScannerDialogFragment.java │ │ │ ├── battery_level │ │ │ ├── BatteryLevelConditionSkillViewFragment.kt │ │ │ ├── BatteryLevelSkillViewFragment.kt │ │ │ ├── BatteryLevelSlot.java │ │ │ ├── BatteryLevelTracker.java │ │ │ ├── BatteryLevelUSourceData.java │ │ │ ├── BatteryLevelUSourceDataFactory.java │ │ │ ├── BatteryLevelUSourceSkill.java │ │ │ └── Utils.java │ │ │ ├── bluetooth_device │ │ │ ├── BTDeviceSkillViewFragment.java │ │ │ ├── BTDeviceSlot.java │ │ │ ├── BTDeviceTracker.java │ │ │ ├── BTDeviceUSourceData.java │ │ │ ├── BTDeviceUSourceDataFactory.java │ │ │ └── BTDeviceUSourceSkill.java │ │ │ ├── bluetooth_enabled │ │ │ ├── BluetoothEnabledSkillViewFragment.java │ │ │ ├── BluetoothEnabledSlot.java │ │ │ ├── BluetoothEnabledTracker.java │ │ │ ├── BluetoothEnabledUSourceData.java │ │ │ ├── BluetoothEnabledUSourceDataFactory.java │ │ │ └── BluetoothEnabledUSourceSkill.java │ │ │ ├── calendar │ │ │ ├── CalConditionInnerData.java │ │ │ ├── CalEventInnerData.java │ │ │ ├── CalendarHelper.java │ │ │ ├── CalendarMatchType.java │ │ │ ├── CalendarSkillViewFragment.java │ │ │ ├── CalendarSlot.java │ │ │ ├── CalendarTracker.java │ │ │ ├── CalendarUSourceData.java │ │ │ ├── CalendarUSourceDataFactory.java │ │ │ └── CalendarUSourceSkill.java │ │ │ ├── call │ │ │ ├── CallReceiver.kt │ │ │ ├── CallSkillViewFragment.java │ │ │ ├── CallSlot.java │ │ │ ├── CallTracker.java │ │ │ ├── CallUSourceData.java │ │ │ ├── CallUSourceDataFactory.java │ │ │ └── CallUSourceSkill.java │ │ │ ├── cell_location │ │ │ ├── CellLocationScannerDialogFragment.java │ │ │ ├── CellLocationSingleData.java │ │ │ ├── CellLocationSkillViewFragment.java │ │ │ ├── CellLocationSlot.java │ │ │ ├── CellLocationTracker.java │ │ │ ├── CellLocationUSourceData.java │ │ │ ├── CellLocationUSourceDataFactory.java │ │ │ └── CellLocationUSourceSkill.java │ │ │ ├── connectivity │ │ │ ├── ConnectivityEventData.java │ │ │ ├── ConnectivityEventDataFactory.java │ │ │ ├── ConnectivitySkillViewFragment.java │ │ │ ├── ConnectivitySlot.java │ │ │ ├── ConnectivityTracker.java │ │ │ ├── ConnectivityType.java │ │ │ └── ConnectivityUSourceSkill.java │ │ │ ├── date │ │ │ ├── DateEventSkillViewFragment.java │ │ │ ├── DateSkillViewFragment.java │ │ │ ├── DateSlot.java │ │ │ ├── DateTracker.java │ │ │ ├── DateUSourceData.java │ │ │ ├── DateUSourceDataFactory.java │ │ │ └── DateUSourceSkill.java │ │ │ ├── day_of_week │ │ │ ├── DayOfWeekEventSkill.java │ │ │ ├── DayOfWeekSkillViewFragment.java │ │ │ ├── DayOfWeekSlot.java │ │ │ ├── DayOfWeekTracker.java │ │ │ ├── DayOfWeekUSourceData.java │ │ │ ├── DayOfWeekUSourceDataFactory.java │ │ │ └── Utils.java │ │ │ ├── headset │ │ │ ├── HeadsetSkillViewFragment.java │ │ │ ├── HeadsetSlot.java │ │ │ ├── HeadsetTracker.java │ │ │ ├── HeadsetUSourceData.java │ │ │ ├── HeadsetUSourceDataFactory.java │ │ │ └── HeadsetUSourceSkill.java │ │ │ ├── location │ │ │ ├── LatLong.java │ │ │ ├── LocationCandidate.kt │ │ │ ├── LocationScannerDialogFragment.java │ │ │ ├── LocationSkillViewFragment.kt │ │ │ ├── LocationSlot.java │ │ │ ├── LocationTracker.java │ │ │ ├── LocationUSourceData.java │ │ │ ├── LocationUSourceDataFactory.java │ │ │ ├── LocationUSourceSkill.java │ │ │ └── LocationUtils.java │ │ │ ├── power │ │ │ ├── BatteryStatus_Old.java │ │ │ ├── PowerSkillViewFragment.java │ │ │ ├── PowerSlot.java │ │ │ ├── PowerStatus.kt │ │ │ ├── PowerTracker.java │ │ │ ├── PowerUSourceData.java │ │ │ ├── PowerUSourceDataFactory.java │ │ │ ├── PowerUSourceSkill.java │ │ │ └── Utils.java │ │ │ ├── screen │ │ │ ├── ScreenSkillViewFragment.java │ │ │ ├── ScreenSlot.java │ │ │ ├── ScreenTracker.java │ │ │ ├── ScreenUSourceData.java │ │ │ ├── ScreenUSourceDataFactory.java │ │ │ └── ScreenUSourceSkill.java │ │ │ ├── time │ │ │ ├── TimeEventSkillViewFragment.java │ │ │ ├── TimeSkillViewFragment.java │ │ │ ├── TimeSlot.java │ │ │ ├── TimeTracker.java │ │ │ ├── TimeUSourceData.java │ │ │ ├── TimeUSourceDataFactory.java │ │ │ └── TimeUSourceSkill.java │ │ │ ├── wifi │ │ │ ├── Utils.java │ │ │ ├── WifiConnSlot.java │ │ │ ├── WifiSkillViewFragment.java │ │ │ ├── WifiTracker.java │ │ │ ├── WifiUSourceData.java │ │ │ ├── WifiUSourceDataFactory.java │ │ │ └── WifiUSourceSkill.java │ │ │ └── wifi_enabled │ │ │ ├── WifiEnabledSkillViewFragment.java │ │ │ ├── WifiEnabledSlot.java │ │ │ ├── WifiEnabledTracker.java │ │ │ ├── WifiEnabledUSourceData.java │ │ │ ├── WifiEnabledUSourceDataFactory.java │ │ │ └── WifiEnabledUSourceSkill.java │ └── res │ │ ├── drawable │ │ ├── boarder_alert.xml │ │ ├── boarder_surrounding.xml │ │ ├── githubicon.png │ │ ├── ic_add_bgcolor_24dp.xml │ │ ├── ic_add_location_black.xml │ │ ├── ic_close_24dp.xml │ │ ├── ic_copyleft_black.xml │ │ ├── ic_dynamics_link.xml │ │ ├── ic_fa_hashtag.xml │ │ ├── ic_info_outline_black.xml │ │ ├── ic_love_border_black.xml │ │ ├── ic_person_outline_black.xml │ │ ├── ic_pick_black.xml │ │ ├── ic_public_black.xml │ │ ├── ic_settings_black_24dp.xml │ │ ├── ic_status_negative.xml │ │ ├── ic_status_negative_inner.xml │ │ ├── ic_status_positive.xml │ │ ├── ic_status_positive_inner.xml │ │ ├── ind_node_negative.xml │ │ ├── ind_node_neutral.xml │ │ ├── ind_node_positive.xml │ │ ├── pref_divider_bottom.xml │ │ ├── pref_divider_center.xml │ │ ├── pref_divider_top.xml │ │ ├── renyuneyun.png │ │ └── side_nav_bar.xml │ │ ├── layout-v21 │ │ └── skill_operation__ringer_mode.xml │ │ ├── layout-v23 │ │ └── skill_operation__ringer_mode.xml │ │ ├── layout │ │ ├── activity_edit_condition.xml │ │ ├── activity_edit_dynamics.xml │ │ ├── activity_edit_event.xml │ │ ├── activity_edit_profile.xml │ │ ├── activity_edit_script.xml │ │ ├── activity_list_dynamics.xml │ │ ├── activity_main.xml │ │ ├── app_bar_main.xml │ │ ├── dialoggy_single_message.xml │ │ ├── easer_status_widget.xml │ │ ├── fragment_container_data_list.xml │ │ ├── fragment_data_collection.xml │ │ ├── fragment_dialog_select_skill.xml │ │ ├── fragment_edit_source_data.xml │ │ ├── fragment_fab_list.xml │ │ ├── fragment_loaded_history_full.xml │ │ ├── fragment_outline.xml │ │ ├── fragment_permission_outline.xml │ │ ├── fragment_pivot.xml │ │ ├── fragment_remote_plugin.xml │ │ ├── fragment_scanner_cell_location.xml │ │ ├── fragment_skillview_container_operation_profile.xml │ │ ├── fragment_skillview_container_source.xml │ │ ├── fragment_welcome_text.xml │ │ ├── item_activity_log.xml │ │ ├── item_data_list.xml │ │ ├── item_dynamics_link.xml │ │ ├── item_header.xml │ │ ├── item_operation.xml │ │ ├── nav_header_main.xml │ │ ├── node_script.xml │ │ ├── pref_divider.xml │ │ ├── pref_plugin_enable.xml │ │ ├── skill_condition__date.xml │ │ ├── skill_condition__headset.xml │ │ ├── skill_condition__ringer_mode.xml │ │ ├── skill_condition__time.xml │ │ ├── skill_event__broadcast.xml │ │ ├── skill_event__condition_event.xml │ │ ├── skill_event__headset.xml │ │ ├── skill_event__nfc_tag.xml │ │ ├── skill_event__notification.xml │ │ ├── skill_event__sms.xml │ │ ├── skill_event__tcp_trip.xml │ │ ├── skill_event__timer.xml │ │ ├── skill_event__widget.xml │ │ ├── skill_operation__bluetooth_connect.xml │ │ ├── skill_operation__broadcast.xml │ │ ├── skill_operation__command.xml │ │ ├── skill_operation__event_control.xml │ │ ├── skill_operation__http_request.xml │ │ ├── skill_operation__launch_app.xml │ │ ├── skill_operation__media_control.xml │ │ ├── skill_operation__network_transmission.xml │ │ ├── skill_operation__play_media.xml │ │ ├── skill_operation__ringer_mode.xml │ │ ├── skill_operation__send_notification.xml │ │ ├── skill_operation__send_sms.xml │ │ ├── skill_operation__set_alarm.xml │ │ ├── skill_operation__toast.xml │ │ ├── skill_operation__ui_mode.xml │ │ ├── skill_operation__volume.xml │ │ ├── skill_operation__wireguard.xml │ │ ├── skill_reusable__intent_fragment_edit_extra.xml │ │ ├── skill_reusable__intent_fragment_extra_item.xml │ │ ├── skill_reusable__switch.xml │ │ ├── skill_usource__battery_level.xml │ │ ├── skill_usource__battery_level_condition.xml │ │ ├── skill_usource__bluetooth_device.xml │ │ ├── skill_usource__bluetooth_enabled.xml │ │ ├── skill_usource__calendar_condition.xml │ │ ├── skill_usource__calendar_event.xml │ │ ├── skill_usource__calendar_inner_condition.xml │ │ ├── skill_usource__calendar_inner_event.xml │ │ ├── skill_usource__calendar_inner_shared.xml │ │ ├── skill_usource__call.xml │ │ ├── skill_usource__cell_location.xml │ │ ├── skill_usource__day_of_week.xml │ │ ├── skill_usource__location.xml │ │ ├── skill_usource__power_status.xml │ │ ├── skill_usource__screen.xml │ │ ├── skill_usource__wifi_connection.xml │ │ ├── skill_usource_wifi_enabled.xml │ │ ├── spinner_simple.xml │ │ ├── view_explained_text_input.xml │ │ ├── widget_event_widget.xml │ │ └── widget_event_widget_configure.xml │ │ ├── menu │ │ ├── activity_history.xml │ │ ├── activity_main_drawer.xml │ │ ├── edit_data.xml │ │ ├── edit_event.xml │ │ ├── list_context.xml │ │ ├── list_data.xml │ │ ├── list_profile.xml │ │ ├── outline.xml │ │ ├── pivot_context_profile.xml │ │ └── pivot_context_script.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_foreground.png │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-az │ │ └── plugins.xml │ │ ├── values-b+es+419 │ │ └── plugins.xml │ │ ├── values-ca │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-cs │ │ └── strings.xml │ │ ├── values-da │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-de │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-eo │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-es │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-fr │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-gl │ │ └── strings.xml │ │ ├── values-he │ │ └── plugins.xml │ │ ├── values-hu │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-id │ │ └── strings.xml │ │ ├── values-it │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-ja │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-ko │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-nb-rNO │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-nl │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-or │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-pl │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-pt │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-ru │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-sv │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-ta │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-tr │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-uk │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-v14 │ │ └── dimens.xml │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-vi │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values-zh-rCN │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values-zh │ │ ├── plugins.xml │ │ └── strings.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── drawables.xml │ │ ├── ic_launcher_background.xml │ │ ├── keys.xml │ │ ├── locales.xml │ │ ├── plugins.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── easer_status_widget_info.xml │ │ ├── plugins_preference.xml │ │ ├── preferences.xml │ │ └── widget_event_widget_info.xml │ └── test │ └── java │ └── ryey │ └── easer │ ├── ExampleUnitTest.java │ ├── core │ ├── data │ │ ├── LogicGraphTest.java │ │ └── ScriptStructureTest.java │ └── ui │ │ └── data │ │ └── AbstractEditDataActivityTest.kt │ └── skills │ ├── PluginDataTest.java │ ├── operation │ └── OperationDataTest.java │ ├── reusable │ └── ReusableDataTest.java │ └── usource │ └── location │ ├── LatLongTest.java │ └── LocationUtilsTest.java ├── asset └── logo │ ├── logo.png │ ├── logomark.png │ ├── ojinal.pdf │ ├── orjinal 1-01.svg │ ├── orjinal 1-02.svg │ └── orjinal.ai ├── build.gradle ├── diagram ├── communication.drawio └── communication.png ├── docs ├── .gitignore ├── 404.html ├── DATA.md ├── DONATE.md ├── EXTEND.md ├── FEATURES.md ├── HOWTO.md ├── README.md ├── TODO.md ├── _config.yml ├── _layouts │ └── default.html ├── en │ ├── DATA.md │ ├── DONATE.md │ ├── EXTEND.md │ ├── FEATURES.md │ ├── HOWTO.md │ ├── README.md │ └── TODO.md └── zh │ ├── DATA.md │ ├── DONATE.md │ ├── EXTEND.md │ ├── FEATURES.md │ ├── HOWTO.md │ ├── README.md │ └── TODO.md ├── fastlane └── metadata │ └── android │ ├── en-US │ ├── changelogs │ │ ├── 100.txt │ │ ├── 100115.txt │ │ ├── 100120.txt │ │ ├── 100121.txt │ │ ├── 100122.txt │ │ ├── 101.txt │ │ ├── 102.txt │ │ ├── 103.txt │ │ ├── 104.txt │ │ ├── 105.txt │ │ ├── 106.txt │ │ ├── 107.txt │ │ ├── 108.txt │ │ ├── 109.txt │ │ ├── 110.txt │ │ ├── 111.txt │ │ ├── 112.txt │ │ ├── 113.txt │ │ ├── 114.txt │ │ ├── 115.txt │ │ ├── 116.txt │ │ ├── 117.txt │ │ ├── 118.txt │ │ ├── 119.txt │ │ ├── 119001.txt │ │ ├── 119999.txt │ │ ├── 120001.txt │ │ ├── 120002.txt │ │ ├── 120999.txt │ │ ├── 121.txt │ │ ├── 121001.txt │ │ ├── 121002.txt │ │ ├── 121999.txt │ │ ├── 122001.txt │ │ ├── 122999.txt │ │ ├── 123.txt │ │ ├── 123001.txt │ │ ├── 123002.txt │ │ ├── 123101.txt │ │ ├── 123102.txt │ │ ├── 123201.txt │ │ ├── 123202.txt │ │ ├── 123203.txt │ │ ├── 123204.txt │ │ ├── 123205.txt │ │ ├── 123999.txt │ │ ├── 124.txt │ │ ├── 124001.txt │ │ ├── 124002.txt │ │ ├── 124999.txt │ │ ├── 125.txt │ │ ├── 125001.txt │ │ ├── 125002.txt │ │ ├── 125999.txt │ │ ├── 126.txt │ │ ├── 126001.txt │ │ ├── 127.txt │ │ ├── 127001.txt │ │ ├── 128.txt │ │ ├── 128001.txt │ │ ├── 128002.txt │ │ ├── 86.txt │ │ ├── 87.txt │ │ ├── 88.txt │ │ ├── 89.txt │ │ ├── 90.txt │ │ ├── 91.txt │ │ ├── 92.txt │ │ ├── 93.txt │ │ ├── 94.txt │ │ ├── 95.txt │ │ ├── 96.txt │ │ ├── 97.txt │ │ ├── 98.txt │ │ └── 99.txt │ ├── full_description.txt │ ├── images │ │ └── phoneScreenshots │ │ │ ├── img0_welcome.jpg │ │ │ ├── img1_drawer.jpg │ │ │ └── img2_pivot.jpg │ └── short_description.txt │ └── zh │ └── full_description.txt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── plugin ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── ryey │ │ └── easer │ │ ├── plugin │ │ ├── PluginDataFormat.java │ │ └── operation │ │ │ └── Category.java │ │ └── remote_plugin │ │ ├── RemoteOperationData.java │ │ └── RemotePlugin.java │ └── res │ └── values │ └── strings.xml ├── settings.gradle └── utils ├── LICENSE ├── new_condition.py ├── new_event.py ├── new_operation.py ├── new_usource.py └── templates.py /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | (You can also use screencast instead.) 21 | 22 | **Expected behavior** 23 | A clear and concise description of what you expected to happen. 24 | 25 | **Error log:** 26 | If on Easer v0.7.6.1 or more recent, please include the error log produced by Easer (surround it with *code* environment). 27 | You'll need to enable the "external logging" setting. 28 | The error logs are under `/sdcard/logger/error/`. 29 | 30 | **Extra phone info (please complete the following information):** 31 | - ROM: [e.g. LineageOS 15.1] 32 | 33 | **Extra logs (optional):** 34 | You can also provide Easer's normal logs (`/sdcard/logger/logs_0.csv`), or LogCat (these are almost equivalent). 35 | Note this log may contain personal information (e.g. Event names). You can annonymize them if necessary. 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FR]" 5 | labels: feature request 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered [optional]** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ master, stable, beta, dev, testing, gh-test ] 6 | pull_request: 7 | branches: [ master, stable, beta, dev, testing, gh-test ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: set up JDK 11 17 | uses: actions/setup-java@v3 18 | with: 19 | java-version: '11' 20 | distribution: 'temurin' 21 | cache: gradle 22 | 23 | - name: Grant execute permission for gradlew 24 | run: chmod +x gradlew 25 | - name: Build with Gradle 26 | run: ./gradlew build 27 | 28 | test: 29 | needs: [build] 30 | runs-on: macos-latest 31 | 32 | steps: 33 | - uses: actions/checkout@v3 34 | - name: set up JDK 11 35 | uses: actions/setup-java@v3 36 | with: 37 | java-version: '11' 38 | distribution: 'temurin' 39 | cache: gradle 40 | - name: Generate unit test coverage report 41 | run: ./gradlew jacocoTestReport 42 | continue-on-error: true 43 | - name: Run Android instrumentation tests 44 | uses: reactivecircus/android-emulator-runner@v2 45 | with: 46 | api-level: 29 47 | script: ./gradlew connectedCheck 48 | continue-on-error: true 49 | - name: Codecov 50 | uses: codecov/codecov-action@v3.1.0 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /captures 6 | ### Android template 7 | # Built application files 8 | *.apk 9 | *.ap_ 10 | 11 | # Files for the ART/Dalvik VM 12 | *.dex 13 | 14 | # Java class files 15 | *.class 16 | 17 | # Generated files 18 | bin/ 19 | gen/ 20 | out/ 21 | 22 | # Gradle files 23 | .gradle/ 24 | build/ 25 | 26 | # Local configuration file (sdk path, etc) 27 | local.properties 28 | 29 | # Proguard folder generated by Eclipse 30 | proguard/ 31 | 32 | # Log Files 33 | *.log 34 | 35 | # Android Studio Navigation editor temp files 36 | .navigation/ 37 | 38 | # Android Studio captures folder 39 | captures/ 40 | 41 | # IntelliJ project files 42 | .idea 43 | out 44 | gen 45 | 46 | release/ 47 | 48 | *.bak 49 | *~ 50 | *.swp 51 | 52 | tmp/ 53 | 54 | # Python 55 | __pycache__/ 56 | *.pyc 57 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/proguard-rules-acra.pro: -------------------------------------------------------------------------------- 1 | # Partially From https://github.com/ACRA/acra/blob/master/acra-core/proguard.cfg 2 | # Under Apache 2.0 (?) 3 | 4 | #ACRA specifics 5 | # Restore some Source file names and restore approximate line numbers in the stack traces, 6 | # otherwise the stack traces are pretty useless 7 | -keepattributes SourceFile,LineNumberTable 8 | 9 | # ACRA needs "annotations" so add this... 10 | # Note: This may already be defined in the default "proguard-android-optimize.txt" 11 | # file in the SDK. If it is, then you don't need to duplicate it. See your 12 | # "project.properties" file to get the path to the default "proguard-android-optimize.txt". 13 | -keepattributes *Annotation* 14 | 15 | # ACRA loads Plugins using reflection, so we need to keep all Plugin classes 16 | -keep class * implements org.acra.plugins.Plugin {*;} 17 | 18 | # ACRA uses enum fields in annotations, so we have to keep those 19 | -keep enum org.acra.** {*;} 20 | 21 | -keep class org.acra.collector.** {*;} 22 | -keep class org.acra.config.** {*;} 23 | -keep class org.acra.interaction.ToastInteraction {*;} 24 | 25 | -keep class ryey.easer.ErrorSenderFactory { *; } 26 | -keep class ryey.easer.ErrorSender { *; } -------------------------------------------------------------------------------- /app/proguard-rules-debug.pro: -------------------------------------------------------------------------------- 1 | -dontobfuscate -------------------------------------------------------------------------------- /app/proguard-rules-guava.pro: -------------------------------------------------------------------------------- 1 | -dontwarn com.google.common.base.** 2 | -keep class com.google.common.base.** {*;} 3 | -dontwarn com.google.errorprone.annotations.** 4 | -keep class com.google.errorprone.annotations.** {*;} 5 | -dontwarn java.lang.ClassValue 6 | -keep class java.lang.ClassValue { *; } 7 | -dontwarn sun.misc.Unsafe 8 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /opt/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # ProGuard warns, but don't know why 20 | -keep class local_skill.eventplugin.EventData {*;} 21 | -------------------------------------------------------------------------------- /app/src/androidTest/assets/test-data-ok.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/renyuneyun/Easer/fca9ef1620fe8975f2e0c1ca8312e9a9434b2707/app/src/androidTest/assets/test-data-ok.zip -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer; 21 | 22 | import androidx.test.runner.AndroidJUnit4; 23 | 24 | import org.junit.Test; 25 | import org.junit.runner.RunWith; 26 | 27 | /** 28 | * Testing Fundamentals 29 | */ 30 | 31 | @RunWith(AndroidJUnit4.class) 32 | public class ApplicationTest { 33 | @Test 34 | public void test() throws Exception { 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/TestHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills; 21 | 22 | import android.os.Parcel; 23 | import android.os.Parcelable; 24 | 25 | public class TestHelper { 26 | public static Parcel writeToParcel(Parcelable parcelable) { 27 | Parcel parcel = Parcel.obtain(); 28 | parcelable.writeToParcel(parcel, 0); 29 | parcel.setDataPosition(0); 30 | return parcel; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/event/nfc_tag/NfcTagEventDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event.nfc_tag; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class NfcTagEventDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | NfcTagEventData dummyData = new NfcTagEventDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | NfcTagEventData parceledData = NfcTagEventData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/event/sms/SmsEventDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event.sms; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class SmsEventDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | SmsEventData dummyData = new SmsEventDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | SmsEventData parceledData = SmsEventData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/event/tcp_trip/TcpTripEventDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event.tcp_trip; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class TcpTripEventDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | TcpTripEventData dummyData = new TcpTripEventDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | TcpTripEventData parceledData = TcpTripEventData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/event/timer/TimerEventDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event.timer; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class TimerEventDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | TimerEventData dummyData = new TimerEventDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | TimerEventData parceledData = TimerEventData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/event/widget/WidgetEventDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event.widget; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class WidgetEventDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | WidgetEventData dummyData = new WidgetEventDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | WidgetEventData parceledData = WidgetEventData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/usource/call/CallUSourceDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.call; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class CallUSourceDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | CallUSourceData dummyData = new CallUSourceDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | CallUSourceData parceledData = CallUSourceData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/usource/date/DateUSourceDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.date; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class DateUSourceDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | DateUSourceData dummyData = new DateUSourceDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | DateUSourceData parceledData = DateUSourceData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/usource/power/PowerUSourceDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.power; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class PowerUSourceDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | PowerUSourceData dummyData = new PowerUSourceDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | PowerUSourceData parceledData = PowerUSourceData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/usource/time/TimeUSourceDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.time; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class TimeUSourceDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | TimeUSourceData dummyData = new TimeUSourceDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | TimeUSourceData parceledData = TimeUSourceData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ryey/easer/skills/usource/wifi/WifiUSourceDataTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.wifi; 21 | 22 | import android.os.Parcel; 23 | 24 | import org.junit.Test; 25 | 26 | import ryey.easer.skills.TestHelper; 27 | 28 | import static org.junit.Assert.assertEquals; 29 | 30 | public class WifiUSourceDataTest { 31 | 32 | @Test 33 | public void testParcel() { 34 | WifiUSourceData dummyData = new WifiUSourceDataFactory().dummyData(); 35 | Parcel parcel = TestHelper.writeToParcel(dummyData); 36 | WifiUSourceData parceledData = WifiUSourceData.CREATOR.createFromParcel(parcel); 37 | assertEquals(dummyData, parceledData); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /app/src/beta/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Easer (beta) 4 | @string/easer_beta 5 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/renyuneyun/Easer/fca9ef1620fe8975f2e0c1ca8312e9a9434b2707/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/ErrorSenderFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer 21 | 22 | import android.content.Context 23 | import org.acra.config.CoreConfiguration 24 | import org.acra.sender.ReportSender 25 | import org.acra.sender.ReportSenderFactory 26 | 27 | class ErrorSenderFactory : ReportSenderFactory { 28 | override fun create(context: Context, config: CoreConfiguration): ReportSender { 29 | return ErrorSender() 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/ImproperImplementationError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2021 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons; 21 | 22 | public class ImproperImplementationError extends Error { 23 | public ImproperImplementationError(String message) { 24 | super(message); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/UnexpectedBehaviourError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons; 21 | 22 | public class UnexpectedBehaviourError extends Exception { 23 | public UnexpectedBehaviourError(String msg) { 24 | super(msg); 25 | } 26 | 27 | public UnexpectedBehaviourError(Exception e) { 28 | super(e); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/InvalidDataInputException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill; 21 | 22 | public class InvalidDataInputException extends Exception { 23 | public InvalidDataInputException() { 24 | } 25 | 26 | public InvalidDataInputException(String msg, String ...args) { 27 | super(String.format(msg, (Object[]) args)); 28 | } 29 | 30 | public InvalidDataInputException(Exception e) { 31 | super(e); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/ValidData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill; 21 | 22 | /** 23 | * This annotation indicates the {@link StorageData} is "valid", 24 | * which means it has already been confirmed as "valid" (e.g. by checking {@link StorageData#isValid()} returns {@true}). 25 | */ 26 | public @interface ValidData { 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/conditionskill/ConditionData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.conditionskill; 21 | 22 | import ryey.easer.commons.local_skill.StorageData; 23 | 24 | public interface ConditionData extends StorageData { 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/dynamics/Dynamics.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.dynamics; 21 | 22 | import androidx.annotation.StringRes; 23 | 24 | public interface Dynamics { 25 | String id(); 26 | 27 | @StringRes 28 | int nameRes(); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/dynamics/SolidDynamicsAssignment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.dynamics; 21 | 22 | import java.util.HashMap; 23 | 24 | public class SolidDynamicsAssignment { 25 | 26 | private HashMap assignments; 27 | 28 | SolidDynamicsAssignment(HashMap assignments) { 29 | this.assignments = assignments; 30 | } 31 | 32 | public String getAssignment(String placeholder) { 33 | if (assignments.containsKey(placeholder)) 34 | return assignments.get(placeholder); 35 | return placeholder; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/eventskill/EventData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.eventskill; 21 | 22 | import androidx.annotation.Nullable; 23 | 24 | import ryey.easer.commons.local_skill.StorageData; 25 | import ryey.easer.commons.local_skill.dynamics.Dynamics; 26 | 27 | public interface EventData extends StorageData { 28 | 29 | @Nullable 30 | Dynamics[] dynamics(); 31 | 32 | @SuppressWarnings({"SimplifiableIfStatement", "RedundantIfStatement"}) 33 | boolean equals(Object obj); 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/operationskill/OperationData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.operationskill; 21 | 22 | import androidx.annotation.NonNull; 23 | import androidx.annotation.Nullable; 24 | 25 | import java.util.Set; 26 | 27 | import ryey.easer.commons.local_skill.StorageData; 28 | import ryey.easer.commons.local_skill.dynamics.SolidDynamicsAssignment; 29 | 30 | public interface OperationData extends StorageData { 31 | @Nullable 32 | Set placeholders(); 33 | 34 | @NonNull 35 | OperationData applyDynamics(SolidDynamicsAssignment dynamicsAssignment); 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/operationskill/PrivilegeUsage.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.operationskill; 21 | 22 | public enum PrivilegeUsage { 23 | no_root, 24 | prefer_root, 25 | root_only, 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/usource/USourceData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.usource; 21 | 22 | import ryey.easer.commons.local_skill.conditionskill.ConditionData; 23 | import ryey.easer.commons.local_skill.eventskill.EventData; 24 | 25 | public interface USourceData extends EventData, ConditionData { 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/commons/local_skill/usource/USourceDataFactory.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.commons.local_skill.usource; 21 | 22 | import ryey.easer.commons.local_skill.conditionskill.ConditionDataFactory; 23 | import ryey.easer.commons.local_skill.eventskill.EventDataFactory; 24 | 25 | public interface USourceDataFactory extends EventDataFactory, ConditionDataFactory { 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/BootUpReceiver.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core; 21 | 22 | import android.content.BroadcastReceiver; 23 | import android.content.Context; 24 | import android.content.Intent; 25 | 26 | import com.orhanobut.logger.Logger; 27 | 28 | public class BootUpReceiver extends BroadcastReceiver { 29 | 30 | @Override 31 | public void onReceive(Context context, Intent intent) { 32 | Logger.d("BootUp onReceive <%s>", intent); 33 | String action = intent.getAction(); 34 | if (Intent.ACTION_BOOT_COMPLETED.equals(action) 35 | || "android.intent.action.QUICKBOOT_POWERON".equals(action)) 36 | EHService.start(context); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/DataSavingFailedException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2020 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core 21 | 22 | import java.io.IOException 23 | 24 | class DataSavingFailedException : IOException { 25 | constructor(message: String): super(message) 26 | constructor(ex: Exception): super(ex) 27 | constructor(): super("Failed to save data to storage (disk)") 28 | } -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/ItemBeingUsedException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2020 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core 21 | 22 | class ItemBeingUsedException : Exception { 23 | constructor(message: String): super(message) 24 | constructor(ex: Exception): super(ex) 25 | constructor(): super() 26 | } -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/UpgradeCompleteReceiver.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core; 21 | 22 | import android.content.BroadcastReceiver; 23 | import android.content.Context; 24 | import android.content.Intent; 25 | 26 | public class UpgradeCompleteReceiver extends BroadcastReceiver { 27 | 28 | @Override 29 | public void onReceive(Context context, Intent intent) { 30 | if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())) 31 | EHService.start(context); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/BuilderInfoClashedException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data; 21 | 22 | public class BuilderInfoClashedException extends Exception { 23 | BuilderInfoClashedException(String msg) { 24 | super(msg); 25 | } 26 | 27 | BuilderInfoClashedException(Exception e) { 28 | super(e); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/InvalidExportedDataException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data; 21 | 22 | public class InvalidExportedDataException extends Exception { 23 | public InvalidExportedDataException(String msg) { 24 | super(msg); 25 | } 26 | public InvalidExportedDataException(Exception e) { 27 | super(e); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/Named.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data; 21 | 22 | public interface Named { 23 | String getName(); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/Renameable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data; 21 | 22 | public interface Renameable extends Named { 23 | void setName(String name); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/Verifiable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data; 21 | 22 | public interface Verifiable { 23 | boolean isValid(); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/WithCreatedVersion.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data; 21 | 22 | public interface WithCreatedVersion { 23 | int createdVersion(); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/RequiredDataNotFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage; 21 | 22 | import java.io.IOException; 23 | 24 | public class RequiredDataNotFoundException extends IOException { 25 | public RequiredDataNotFoundException(String msg, Object ...args) { 26 | super(String.format(msg, (Object[]) args)); 27 | } 28 | 29 | public RequiredDataNotFoundException(Exception e) { 30 | super(e); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/ConditionDataStorageBackendInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | import ryey.easer.core.data.ConditionStructure; 23 | 24 | public interface ConditionDataStorageBackendInterface extends DataStorageBackendCommonInterface { 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/EventDataStorageBackendInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | import ryey.easer.core.data.EventStructure; 23 | 24 | public interface EventDataStorageBackendInterface extends DataStorageBackendCommonInterface { 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/Parser.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | import java.io.IOException; 23 | import java.io.InputStream; 24 | 25 | import ryey.easer.commons.local_skill.IllegalStorageDataException; 26 | 27 | public interface Parser { 28 | T parse(InputStream in) throws IOException, IllegalStorageDataException; 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/ProfileDataStorageBackendInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | import ryey.easer.core.data.ProfileStructure; 23 | 24 | public interface ProfileDataStorageBackendInterface extends DataStorageBackendCommonInterface { 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/ScriptDataStorageBackendInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | import java.io.IOException; 23 | 24 | import ryey.easer.core.data.ScriptStructure; 25 | 26 | public interface ScriptDataStorageBackendInterface extends DataStorageBackendCommonInterface { 27 | void update(ScriptStructure scriptStructure) throws IOException; 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/Serializer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | public interface Serializer { 23 | String serialize(T data)throws UnableToSerializeException; 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/UnableToSerializeException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend; 21 | 22 | 23 | public class UnableToSerializeException extends Exception { 24 | public UnableToSerializeException(String message) { 25 | super(message); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/data/storage/backend/json/NC.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.data.storage.backend.json; 21 | 22 | public class NC { 23 | public static final String SUFFIX = ".json"; 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/dynamics/CoreDynamics.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.dynamics; 21 | 22 | import androidx.annotation.NonNull; 23 | 24 | public class CoreDynamics { 25 | 26 | private static CoreDynamicsInterface[] coreDynamicsArray = { 27 | new DateDynamics(), 28 | new TimeDynamics(), 29 | new ScriptNameDynamics(), 30 | new ProfileNameDynamics(), 31 | }; 32 | 33 | @NonNull 34 | public static CoreDynamicsInterface[] coreDynamics() { 35 | return coreDynamicsArray; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/dynamics/CoreDynamicsInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.dynamics; 21 | 22 | import android.content.Context; 23 | import android.os.Bundle; 24 | 25 | import androidx.annotation.NonNull; 26 | 27 | import ryey.easer.commons.local_skill.dynamics.Dynamics; 28 | 29 | public interface CoreDynamicsInterface extends Dynamics { 30 | String invoke(@NonNull Context context, @NonNull Bundle extras); 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/log/ActivityLog.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.log 21 | 22 | import android.os.Parcelable 23 | 24 | interface ActivityLog : Parcelable { 25 | 26 | fun time(): Long 27 | 28 | fun extraInfo(): String? 29 | 30 | @Suppress("RedundantIf") 31 | override fun equals(other: Any?): Boolean 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/ui/setting/RemotePluginInfoPreference.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.ui.setting; 21 | 22 | import android.content.Context; 23 | import android.preference.Preference; 24 | 25 | import ryey.easer.core.RemotePluginInfo; 26 | 27 | public class RemotePluginInfoPreference extends Preference { 28 | 29 | public RemotePluginInfoPreference(Context context, RemotePluginInfo pluginInfo) { 30 | super(context); 31 | setTitle(pluginInfo.getPluginName()); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/core/ui/version_n_info/Info.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.core.ui.version_n_info 21 | 22 | import android.content.Context 23 | import android.content.Intent 24 | import android.preference.PreferenceManager 25 | import ryey.easer.R 26 | 27 | object Info { 28 | fun welcome(context: Context) { 29 | // Show Welcome page at first launch 30 | if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(context.getString(R.string.key_pref_welcome), true)) { 31 | context.startActivity(Intent(context, WelcomeActivity::class.java)) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/event/AbstractEventData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event; 21 | 22 | import ryey.easer.commons.local_skill.eventskill.EventData; 23 | 24 | public abstract class AbstractEventData implements EventData { 25 | 26 | @SuppressWarnings({"SimplifiableIfStatement", "RedundantIfStatement"}) 27 | @Override 28 | public boolean equals(Object obj) { 29 | if (obj == null || !(obj instanceof AbstractEventData)) 30 | return false; 31 | return true; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/event/broadcast/ReceiverSideIntentData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.event.broadcast; 21 | 22 | import java.util.ArrayList; 23 | import java.util.List; 24 | 25 | import javax.annotation.Nullable; 26 | 27 | import ryey.easer.skills.reusable.Extras; 28 | 29 | class ReceiverSideIntentData { 30 | List action = new ArrayList<>(); 31 | List category = new ArrayList<>(); 32 | @Nullable 33 | Extras extras; 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/bluetooth/BluetoothSkillViewFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.operation.bluetooth; 21 | 22 | import androidx.annotation.NonNull; 23 | 24 | import ryey.easer.commons.local_skill.InvalidDataInputException; 25 | import ryey.easer.commons.local_skill.ValidData; 26 | import ryey.easer.skills.operation.SwitchSkillViewFragment; 27 | 28 | public class BluetoothSkillViewFragment extends SwitchSkillViewFragment { 29 | 30 | @ValidData 31 | @NonNull 32 | @Override 33 | public BluetoothOperationData getData() throws InvalidDataInputException { 34 | return new BluetoothOperationData(state()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/cellular/CellularSkillViewFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.operation.cellular; 21 | 22 | import androidx.annotation.NonNull; 23 | 24 | import ryey.easer.commons.local_skill.InvalidDataInputException; 25 | import ryey.easer.commons.local_skill.ValidData; 26 | import ryey.easer.skills.operation.SwitchSkillViewFragment; 27 | 28 | public class CellularSkillViewFragment extends SwitchSkillViewFragment { 29 | 30 | @ValidData 31 | @NonNull 32 | @Override 33 | public CellularOperationData getData() throws InvalidDataInputException { 34 | return new CellularOperationData(state()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/hotspot/HotspotSkillViewFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.operation.hotspot; 21 | 22 | import androidx.annotation.NonNull; 23 | 24 | import ryey.easer.commons.local_skill.InvalidDataInputException; 25 | import ryey.easer.commons.local_skill.ValidData; 26 | import ryey.easer.skills.operation.SwitchSkillViewFragment; 27 | 28 | public class HotspotSkillViewFragment extends SwitchSkillViewFragment { 29 | 30 | @ValidData 31 | @NonNull 32 | @Override 33 | public HotspotOperationData getData() throws InvalidDataInputException { 34 | return new HotspotOperationData(state()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/intent/operations/ActivityLoader.java: -------------------------------------------------------------------------------- 1 | package ryey.easer.skills.operation.intent.operations; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import ryey.easer.skills.operation.intent.IntentLoader; 8 | import ryey.easer.skills.operation.intent.IntentOperationData; 9 | 10 | public class ActivityLoader extends IntentLoader { 11 | 12 | public ActivityLoader(@NonNull Context context) { 13 | super(context); 14 | } 15 | 16 | @Override 17 | public void _load(@NonNull IntentOperationData data, @NonNull OnResultCallback callback) { 18 | 19 | context.startActivity(this.getIntent(data)); 20 | callback.onResult(true); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/intent/operations/ActivityOperationSkill.java: -------------------------------------------------------------------------------- 1 | package ryey.easer.skills.operation.intent.operations; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import ryey.easer.R; 8 | import ryey.easer.commons.local_skill.SkillView; 9 | import ryey.easer.skills.operation.OperationLoader; 10 | import ryey.easer.skills.operation.intent.IntentOperationData; 11 | import ryey.easer.skills.operation.intent.IntentOperationSkill; 12 | import ryey.easer.skills.operation.intent.IntentSkillViewFragment; 13 | 14 | public class ActivityOperationSkill extends IntentOperationSkill { 15 | @NonNull 16 | @Override 17 | public String id() { 18 | return "start_activity"; 19 | } 20 | 21 | @Override 22 | public int name() { 23 | return R.string.operation_start_activity; 24 | } 25 | 26 | 27 | @NonNull 28 | @Override 29 | public OperationLoader loader(@NonNull Context context) { 30 | return new ActivityLoader(context); 31 | } 32 | 33 | @NonNull 34 | @Override 35 | public SkillView view() { 36 | IntentSkillViewFragment ret = new DummyIntentSkillViewFragment(); 37 | ret.setSkillID(id()); 38 | return ret; 39 | } 40 | 41 | public static class DummyIntentSkillViewFragment extends IntentSkillViewFragment { 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/intent/operations/BroadcastOperationSkill.java: -------------------------------------------------------------------------------- 1 | package ryey.easer.skills.operation.intent.operations; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import ryey.easer.R; 8 | import ryey.easer.commons.local_skill.SkillView; 9 | import ryey.easer.skills.operation.OperationLoader; 10 | import ryey.easer.skills.operation.intent.IntentOperationData; 11 | import ryey.easer.skills.operation.intent.IntentOperationSkill; 12 | import ryey.easer.skills.operation.intent.IntentSkillViewFragment; 13 | 14 | public class BroadcastOperationSkill extends IntentOperationSkill { 15 | @NonNull 16 | @Override 17 | public String id() { 18 | return "send_broadcast"; 19 | } 20 | 21 | @Override 22 | public int name() { 23 | return R.string.operation_broadcast; 24 | } 25 | 26 | 27 | @NonNull 28 | @Override 29 | public OperationLoader loader(@NonNull Context context) { 30 | return new BroadcastLoader(context); 31 | } 32 | 33 | @NonNull 34 | @Override 35 | public SkillView view() { 36 | IntentSkillViewFragment ret = new DummyIntentSkillViewFragment(); 37 | ret.setSkillID(id()); 38 | return ret; 39 | } 40 | 41 | public static class DummyIntentSkillViewFragment extends IntentSkillViewFragment 42 | { 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/intent/operations/ServiceLoader.java: -------------------------------------------------------------------------------- 1 | package ryey.easer.skills.operation.intent.operations; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import ryey.easer.skills.operation.intent.IntentLoader; 8 | import ryey.easer.skills.operation.intent.IntentOperationData; 9 | 10 | public class ServiceLoader extends IntentLoader { 11 | public ServiceLoader(@NonNull Context context) { 12 | super(context); 13 | } 14 | 15 | @Override 16 | public void _load(@NonNull IntentOperationData data, @NonNull OnResultCallback callback) { 17 | context.startService(this.getIntent(data)); 18 | callback.onResult(true); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/intent/operations/ServiceOperationSkill.java: -------------------------------------------------------------------------------- 1 | package ryey.easer.skills.operation.intent.operations; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import ryey.easer.R; 8 | import ryey.easer.commons.local_skill.SkillView; 9 | import ryey.easer.skills.operation.OperationLoader; 10 | import ryey.easer.skills.operation.intent.IntentOperationData; 11 | import ryey.easer.skills.operation.intent.IntentOperationSkill; 12 | import ryey.easer.skills.operation.intent.IntentSkillViewFragment; 13 | 14 | public class ServiceOperationSkill extends IntentOperationSkill { 15 | @NonNull 16 | @Override 17 | public String id() { 18 | return "start_service"; 19 | } 20 | 21 | @Override 22 | public int name() { 23 | return R.string.operation_start_service; 24 | } 25 | 26 | 27 | @NonNull 28 | @Override 29 | public OperationLoader loader(@NonNull Context context) { 30 | return new ServiceLoader(context); 31 | } 32 | 33 | @NonNull 34 | @Override 35 | public SkillView view() { 36 | IntentSkillViewFragment ret = new DummyIntentSkillViewFragment(); 37 | ret.setSkillID(id()); 38 | return ret; 39 | } 40 | 41 | public static class DummyIntentSkillViewFragment extends IntentSkillViewFragment 42 | { 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/rotation/RotationSkillViewFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.operation.rotation; 21 | 22 | import androidx.annotation.NonNull; 23 | 24 | import ryey.easer.commons.local_skill.InvalidDataInputException; 25 | import ryey.easer.commons.local_skill.ValidData; 26 | import ryey.easer.skills.operation.SwitchSkillViewFragment; 27 | 28 | public class RotationSkillViewFragment extends SwitchSkillViewFragment { 29 | 30 | @ValidData 31 | @NonNull 32 | @Override 33 | public RotationOperationData getData() throws InvalidDataInputException { 34 | return new RotationOperationData(state()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/toast/ToastLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2018 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.operation.toast; 21 | 22 | import android.content.Context; 23 | import android.widget.Toast; 24 | 25 | import androidx.annotation.NonNull; 26 | 27 | import ryey.easer.skills.operation.OperationLoader; 28 | 29 | public class ToastLoader extends OperationLoader { 30 | ToastLoader(Context context) { 31 | super(context); 32 | } 33 | 34 | @Override 35 | public void _load(@NonNull ToastOperationData data, @NonNull OnResultCallback callback) { 36 | Toast.makeText(context, data.text.raw, Toast.LENGTH_SHORT).show(); 37 | callback.onResult(true); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/operation/wifi/WifiSkillViewFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.operation.wifi; 21 | 22 | import androidx.annotation.NonNull; 23 | 24 | import ryey.easer.commons.local_skill.InvalidDataInputException; 25 | import ryey.easer.commons.local_skill.ValidData; 26 | import ryey.easer.skills.operation.SwitchSkillViewFragment; 27 | 28 | public class WifiSkillViewFragment extends SwitchSkillViewFragment { 29 | 30 | @ValidData 31 | @NonNull 32 | @Override 33 | public WifiOperationData getData() throws InvalidDataInputException { 34 | return new WifiOperationData(state()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/usource/connectivity/ConnectivityType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.connectivity; 21 | 22 | class ConnectivityType { 23 | static final int TYPE_NOT_CONNECTED = 0; 24 | static final int TYPE_WIFI = 10; 25 | static final int TYPE_MOBILE = 20; 26 | static final int TYPE_ETHERNET = 30; 27 | static final int TYPE_BLUETOOTH = 40; 28 | static final int TYPE_VPN = 100; 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/usource/location/LocationCandidate.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.location 21 | 22 | import android.location.Location 23 | 24 | class LocationCandidate(val latitude: Double, val longitude: Double, val accuracy: Float) { 25 | override fun toString(): String { 26 | return "Latitude: %f\nLongitude: %f\nAccuracy: %f (m)".format(latitude, longitude, accuracy) 27 | } 28 | 29 | companion object { 30 | fun fromLocation(location: Location): LocationCandidate { 31 | return LocationCandidate(location.latitude, location.longitude, location.accuracy) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/usource/power/BatteryStatus_Old.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.power; 21 | 22 | @Deprecated 23 | class BatteryStatus_Old { 24 | static final int charging = 0; 25 | static final int discharging = 2; 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/ryey/easer/skills/usource/power/PowerStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016 - 2019 Rui Zhao 3 | * 4 | * This file is part of Easer. 5 | * 6 | * Easer is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * Easer is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with Easer. If not, see . 18 | */ 19 | 20 | package ryey.easer.skills.usource.power 21 | 22 | enum class BatteryStatus { 23 | discharging, 24 | charging, 25 | } 26 | 27 | enum class ChargingMethod { 28 | any, 29 | ac, 30 | usb, 31 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/boarder_alert.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/boarder_surrounding.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/githubicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/renyuneyun/Easer/fca9ef1620fe8975f2e0c1ca8312e9a9434b2707/app/src/main/res/drawable/githubicon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_bgcolor_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_location_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copyleft_black.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dynamics_link.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fa_hashtag.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_outline_black.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_love_border_black.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_outline_black.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pick_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_public_black.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_status_negative.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_status_negative_inner.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_status_positive.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_status_positive_inner.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ind_node_negative.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ind_node_neutral.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ind_node_positive.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pref_divider_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pref_divider_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pref_divider_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/renyuneyun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/renyuneyun/Easer/fca9ef1620fe8975f2e0c1ca8312e9a9434b2707/app/src/main/res/drawable/renyuneyun.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_bar_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 21 | 22 | 23 | 24 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialoggy_single_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/easer_status_widget.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_container_data_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | 14 | 15 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_data_collection.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_dialog_select_skill.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_edit_source_data.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |