public void update(final FragmentActivity activity) {
		final Application app = getApplication();
		final DevicePolicies policies = new DevicePolicies(activity);
		final boolean is_mainland_owner = policies.isProfileOrDeviceOwnerOnCallingUser(), has_profile = Users.hasProfile();
		features.beginBatchedUpdates();
		features.clear();

		if (SHOW_ALL || IslandFiles.isCompatible(activity)) {
			final boolean has_across_users_permission = Permissions.has(activity, Permissions.INTERACT_ACROSS_USERS);
			if (! has_across_users_permission)
				addFeature(app, "file_shuttle_prereq", R.string.featured_file_shuttle_title, R.string.featured_file_shuttle_description, 0,
						R.string.action_learn_more, c -> WebContent.view(c, Config.URL_FILE_SHUTTLE.get()));
			else if (! Permissions.has(activity, WRITE_EXTERNAL_STORAGE) || ! IslandFiles.isFileShuttleEnabled(activity)) {
				final String tag = "file_shuttle";
				addFeatureRaw(app, tag, R.string.featured_file_shuttle_title, R.string.featured_file_shuttle_description,
						0, R.string.action_activate, vm -> { if (IslandFiles.enableFileShuttle(activity)) removeFeature(tag); });
			} else {
				Analytics.$().setProperty(Analytics.Property.FileShuttleEnabled, "1");
				addFeaturedApp(R.string.featured_fx_title, R.string.featured_fx_description, R.drawable.ic_launcher_fx, "nextapp.fx");
			}
		}

		final boolean dev_enabled = "1".equals(Settings.Global.getString(app.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED));
		final LiveUserRestriction adb_secure = ! is_mainland_owner && ! has_profile ? null
				: new LiveUserRestriction(app, DISALLOW_DEBUGGING_FEATURES, is_mainland_owner ? Users.owner : Users.profile);
		if (adb_secure != null && (SHOW_ALL || dev_enabled || adb_secure.query(activity))) {	// ADB is disabled so long as ADB secure is enabled.
			addFeatureRaw(app, "adb_secure", is_mainland_owner ? R.string.featured_adb_secure_title : R.string.featured_adb_secure_island_title,
					R.string.featured_adb_secure_description,0, map(adb_secure, enabled -> enabled ? R.string.action_disable : R.string.action_enable),
					vm -> AdbSecure.toggleAdbSecure(activity, Objects.equals(vm.button.getValue(), R.string.action_enable), false));
		}

		if (SHOW_ALL || ! is_mainland_owner)
			addFeature(app, "managed_mainland", R.string.featured_managed_mainland_title, R.string.featured_managed_mainland_description, 0,
					R.string.featured_button_setup, c -> SettingsActivity.startWithPreference(activity, IslandSettingsFragment.class));

		addFeaturedApp(R.string.featured_greenify_title, R.string.featured_greenify_description, R.drawable.ic_launcher_greenify, "com.oasisfeng.greenify");
		addFeaturedApp(R.string.featured_saf_enhancer_title, R.string.featured_saf_enhancer_description, R.drawable.ic_launcher_saf_enhancer,
				"app.gwo.safenhancer.lite", "app.gwo.safenhancer");

		addFeaturedApp(R.string.featured_appops_title, R.string.featured_appops_description, R.drawable.ic_launcher_appops,
				"rikka.appops", "rikka.appops.pro");

		features.endBatchedUpdates();
	}
View-model for featured list

Created by Oasis on 2018/5/18.
mobile/src/main/java/com/oasisfeng/island/featured/FeaturedListViewModel.java