diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..3e45edce8c5256c7b4e35e56f5aea09627e1c4dc --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,30 @@ +image: "registry.gitlab.e.foundation:5000/e/apps/docker-android-apps-cicd:latest" + +stages: + - build + +variables: + GRADLE_VERSION: "gradle-5.4.1" + GIT_SUBMODULE_STRATEGY: "recursive" + +before_script: + - git fetch + - export GRADLE_USER_HOME=$(pwd)/.gradle + - curl -sL https://services.gradle.org/distributions/${GRADLE_VERSION}-bin.zip -o /gradle.zip + - unzip /gradle.zip -d /gradle + - PATH="$PATH:/gradle/${GRADLE_VERSION}/bin" + - JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS} -Dfile.encoding=UTF8" + - gradle dependencies + +cache: + key: ${CI_PROJECT_ID} + paths: + - .gradle/ + +build: + stage: build + script: + - gradle assemble + artifacts: + paths: + - opentasks/build/outputs/ diff --git a/opentasks-provider/src/main/res/values/opentasks_defaults.xml b/opentasks-provider/src/main/res/values/opentasks_defaults.xml index 008359558196ff0c18beeefdacfd4bf2fe1c5989..5135fc4f5f8556013ddcf899b1511fc40a0d341a 100644 --- a/opentasks-provider/src/main/res/values/opentasks_defaults.xml +++ b/opentasks-provider/src/main/res/values/opentasks_defaults.xml @@ -3,6 +3,6 @@ org.dmfs.tasks + translatable="false">foundation.e.tasks \ No newline at end of file diff --git a/opentasks-provider/src/test/java/org/dmfs/provider/tasks/processors/tasks/instancedata/DatedTest.java b/opentasks-provider/src/test/java/org/dmfs/provider/tasks/processors/tasks/instancedata/DatedTest.java index 4d60f5b42e31f90baae1e5bc69457384b4ac7ee1..43bb5b955fdb9945134c70478dfe6380bfddb395 100644 --- a/opentasks-provider/src/test/java/org/dmfs/provider/tasks/processors/tasks/instancedata/DatedTest.java +++ b/opentasks-provider/src/test/java/org/dmfs/provider/tasks/processors/tasks/instancedata/DatedTest.java @@ -17,6 +17,7 @@ package org.dmfs.provider.tasks.processors.tasks.instancedata; import android.content.ContentValues; +import android.util.Log; import org.dmfs.jems.optional.elementary.Present; import org.dmfs.provider.tasks.utils.ContentValuesWithLong; @@ -53,10 +54,12 @@ public class DatedTest { DateTime start = DateTime.parse("Europe/Berlin", "20171208T125500"); - ContentValues instanceData = new Dated(new Present<>(start), "ts", "sorting", ContentValues::new).value(); + ContentValues instanceData = new Dated(new Present<>(start), + "ts", + "sorting", ContentValues::new).value(); assertThat(instanceData, new ContentValuesWithLong("ts", start.getTimestamp())); - assertThat(instanceData, new ContentValuesWithLong("sorting", start.getInstance())); + assertThat(instanceData, new ContentValuesWithLong("sorting", start.getInstance())); assertThat(instanceData.size(), is(2)); } } \ No newline at end of file diff --git a/opentasks/build.gradle b/opentasks/build.gradle index de5be1922f78b32d45a9b82ad26f61e08aa1053c..4e0a57868a32ad5c642c91f247c69a98d5ed73d8 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -15,7 +15,7 @@ def gitCommitNo = { ref -> android { compileSdkVersion COMPILE_SDK_VERSION.toInteger() defaultConfig { - applicationId "org.dmfs.tasks" + applicationId "foundation.e.tasks" minSdkVersion MIN_SDK_VERSION.toInteger() targetSdkVersion TARGET_SDK_VERSION.toInteger() // spread version code to allow inserting versions if necessary diff --git a/opentasks/src/main/AndroidManifest.xml b/opentasks/src/main/AndroidManifest.xml index ce40af08003613543e25cda458dd60039f4fa3b7..1b7f0940f9351dfe88bc02e52b281643cc924dfe 100644 --- a/opentasks/src/main/AndroidManifest.xml +++ b/opentasks/src/main/AndroidManifest.xml @@ -21,7 +21,6 @@ android:name=".TasksApplication" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="false" android:taskAffinity="org.dmfs.tasks.TaskListActivity" android:theme="@style/OpenTasksAppTheme"> @@ -152,6 +151,17 @@ android:value="org.dmfs.tasks.TaskListActivity"/> + + + + + */ -public class TaskListActivity extends BaseActivity implements TaskListFragment.Callbacks, ViewTaskFragment.Callback -{ +public class TaskListActivity extends BaseActivity implements TaskListFragment.Callbacks, ViewTaskFragment.Callback { /** * Tells the activity to display the details of the task with the URI from the intent data. @@ -181,12 +184,10 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - protected void onCreate(Bundle savedInstanceState) - { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (mLastUsedColor == android.graphics.Color.TRANSPARENT) - { + if (mLastUsedColor == android.graphics.Color.TRANSPARENT) { // no saved color, use the primary color mLastUsedColor = new PrimaryColor(this).argb(); } @@ -196,10 +197,8 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C resolveIntentAction(getIntent()); - if (mSelectedTaskUri != null) - { - if (!mTwoPane && mShouldSwitchToDetail) - { + if (mSelectedTaskUri != null) { + if (!mTwoPane && mShouldSwitchToDetail) { Intent viewTaskIntent = new Intent(Intent.ACTION_VIEW); viewTaskIntent.setData(mSelectedTaskUri); viewTaskIntent.putExtra(ViewTaskActivity.EXTRA_COLOR, mLastUsedColor); @@ -207,9 +206,7 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C mShouldSwitchToDetail = false; mTransientState = true; } - } - else - { + } else { mShouldSwitchToDetail = false; } @@ -221,29 +218,25 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C mAuthority = AuthorityUtil.taskAuthority(this); mSearchHistoryHelper = new SearchHistoryHelper(this); - if (findViewById(R.id.task_detail_container) != null) - { + if (findViewById(R.id.task_detail_container) != null) { /* Note: 'savedInstanceState == null' is not used here as would be usual with fragments, because of the case of when rotation means switching from one-pane mode to two-pane mode on small tablets and the fragment has to added. To cover that case as well, the fragment is always replaced. */ replaceTaskDetailsFragment( mSelectedTaskUri == null ? EmptyTaskFragment.newInstance(new ValueColor(mLastUsedColor)) : ViewTaskFragment.newInstance(mSelectedTaskUri, new ValueColor(mLastUsedColor))); - } - else - { + } else { // When rotating the screen means switching from two-pane to single-pane mode (on small tablets), remove the obsolete fragment that gets recreated by FragmentManager: FragmentManager fragmentManager = getSupportFragmentManager(); Fragment detailFragment = fragmentManager.findFragmentByTag(DETAILS_FRAGMENT_TAG); - if (detailFragment != null) - { + if (detailFragment != null) { fragmentManager.beginTransaction().remove(detailFragment).commit(); } } - mGroupingFactories = new AbstractGroupingFactory[] { + mGroupingFactories = new AbstractGroupingFactory[]{ new ByList(mAuthority, this), new ByDueDate(mAuthority), new ByStartDate(mAuthority), - new ByPriority(mAuthority, this), new ByProgress(mAuthority), new BySearch(mAuthority, mSearchHistoryHelper) }; + new ByPriority(mAuthority, this), new ByProgress(mAuthority), new BySearch(mAuthority, mSearchHistoryHelper)}; mPagerAdapter = new Unchecked<>(() -> new TaskGroupPagerAdapter(getSupportFragmentManager(), mGroupingFactories, this, R.xml.listview_tabs)).value(); @@ -252,19 +245,14 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C int currentPageIndex = mPagerAdapter.getPagePosition(mCurrentPageId); - if (currentPageIndex >= 0) - { + if (currentPageIndex >= 0) { mCurrentPagePosition = currentPageIndex; mViewPager.setCurrentItem(currentPageIndex); - if (mCurrentPageId == R.id.task_group_search) - { - if (mSearchItem != null) - { + if (mCurrentPageId == R.id.task_group_search) { + if (mSearchItem != null) { // that's actually quite impossible to happen MenuItemCompat.expandActionView(mSearchItem); - } - else - { + } else { mAutoExpandSearchView = true; } } @@ -276,27 +264,22 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C mTabs.setupWithViewPager(mViewPager); setupTabIcons(); - mViewPager.addOnPageChangeListener(new OnPageChangeListener() - { + mViewPager.addOnPageChangeListener(new OnPageChangeListener() { @Override - public void onPageSelected(int position) - { + public void onPageSelected(int position) { mSelectedTaskUri = null; mCurrentPagePosition = position; int newPageId = mPagerAdapter.getPageId(mCurrentPagePosition); - if (newPageId == R.id.task_group_search) - { + if (newPageId == R.id.task_group_search) { int oldPageId = mCurrentPageId; mCurrentPageId = newPageId; // store the page position we're coming from mPreviousPagePosition = mPagerAdapter.getPagePosition(oldPageId); - } - else if (mCurrentPageId == R.id.task_group_search) - { + } else if (mCurrentPageId == R.id.task_group_search) { // we've been on the search page before, so commit the search and close the search view mSearchHistoryHelper.commitSearch(); mHandler.post(mSearchUpdater); @@ -309,22 +292,17 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) - { + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override - public void onPageScrollStateChanged(int state) - { - if (state == ViewPager.SCROLL_STATE_IDLE && mCurrentPageId == R.id.task_group_search) - { + public void onPageScrollStateChanged(int state) { + if (state == ViewPager.SCROLL_STATE_IDLE && mCurrentPageId == R.id.task_group_search) { // the search page is selected now, expand the search view - mHandler.postDelayed(new Runnable() - { + mHandler.postDelayed(new Runnable() { @Override - public void run() - { + public void run() { MenuItemCompat.expandActionView(mSearchItem); } }, 50); @@ -334,14 +312,11 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C }); mFloatingActionButton = (FloatingActionButton) findViewById(R.id.floating_action_button); - if (mFloatingActionButton != null) - { - mFloatingActionButton.setOnClickListener(new OnClickListener() - { + if (mFloatingActionButton != null) { + mFloatingActionButton.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) - { + public void onClick(View v) { onAddNewTask(); } }); @@ -349,34 +324,29 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C } - private void setupTabIcons() - { - for (int i = 0, count = mPagerAdapter.getCount(); i < count; ++i) - { + private void setupTabIcons() { + for (int i = 0, count = mPagerAdapter.getCount(); i < count; ++i) { mTabs.getTabAt(i).setIcon(mPagerAdapter.getTabIcon(i)); } } @Override - protected void onResume() - { + protected void onResume() { updateTitle(mCurrentPageId); super.onResume(); } @Override - protected void onNewIntent(Intent intent) - { + protected void onNewIntent(Intent intent) { resolveIntentAction(intent); super.onNewIntent(intent); } @Override - protected void onDestroy() - { + protected void onDestroy() { super.onDestroy(); mSearchHistoryHelper.close(); } @@ -386,22 +356,16 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C * Callback method from {@link TaskListFragment.Callbacks} indicating that the item with the given ID was selected. */ @Override - public void onItemSelected(@NonNull Uri uri, @NonNull Color taskListColor, boolean forceReload, int pagePosition) - { + public void onItemSelected(@NonNull Uri uri, @NonNull Color taskListColor, boolean forceReload, int pagePosition) { // only accept selections from the current visible task fragment or the activity itself - if (pagePosition == -1 || pagePosition == mCurrentPagePosition) - { - if (mTwoPane) - { - if (forceReload) - { + if (pagePosition == -1 || pagePosition == mCurrentPagePosition) { + if (mTwoPane) { + if (forceReload) { mSelectedTaskUri = uri; mShouldSwitchToDetail = false; } replaceTaskDetailsFragment(ViewTaskFragment.newInstance(uri, taskListColor)); - } - else if (forceReload) - { + } else if (forceReload) { mSelectedTaskUri = uri; // In single-pane mode, simply start the detail activity @@ -417,13 +381,10 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onItemRemoved(@NonNull Uri taskUri) - { - if (taskUri.equals(mSelectedTaskUri)) - { + public void onItemRemoved(@NonNull Uri taskUri) { + if (taskUri.equals(mSelectedTaskUri)) { mSelectedTaskUri = null; - if (mTwoPane) - { + if (mTwoPane) { replaceTaskDetailsFragment(EmptyTaskFragment.newInstance(new ValueColor(mLastUsedColor))); } } @@ -431,8 +392,7 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onAddNewTask() - { + public void onAddNewTask() { Intent editTaskIntent = new Intent(Intent.ACTION_INSERT); editTaskIntent.setData(Tasks.getContentUri(mAuthority)); startActivityForResult(editTaskIntent, REQUEST_CODE_NEW_TASK); @@ -440,12 +400,9 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public ExpandableGroupDescriptor getGroupDescriptor(int pageId) - { - for (AbstractGroupingFactory factory : mGroupingFactories) - { - if (factory.getId() == pageId) - { + public ExpandableGroupDescriptor getGroupDescriptor(int pageId) { + for (AbstractGroupingFactory factory : mGroupingFactories) { + if (factory.getId() == pageId) { return factory.getExpandableGroupDescriptor(); } } @@ -453,12 +410,10 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C } - private void replaceTaskDetailsFragment(@NonNull Fragment fragment) - { + private void replaceTaskDetailsFragment(@NonNull Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); // only change state if the state has not been saved yet, otherwise just drop it - if (!fragmentManager.isStateSaved()) - { + if (!fragmentManager.isStateSaved()) { fragmentManager.beginTransaction() .setCustomAnimations(0, R.anim.openttasks_fade_exit, 0, 0) .replace(R.id.task_detail_container, fragment, DETAILS_FRAGMENT_TAG).commit(); @@ -466,10 +421,8 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C } - private void updateTitle(int pageId) - { - switch (pageId) - { + private void updateTitle(int pageId) { + switch (pageId) { case R.id.task_group_by_list: getSupportActionBar().setTitle(R.string.task_group_title_list); break; @@ -493,28 +446,21 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C } - private void resolveIntentAction(Intent intent) - { + private void resolveIntentAction(Intent intent) { // check which task should be selected - if (intent.getBooleanExtra(EXTRA_DISPLAY_TASK, false)) - - { + if (intent.getBooleanExtra(EXTRA_DISPLAY_TASK, false)) { mShouldSwitchToDetail = true; mSelectedTaskUri = intent.getData(); } - if (intent.getBooleanExtra(EXTRA_DISPLAY_TASK, false) && intent.getBooleanExtra(EXTRA_FORCE_LIST_SELECTION, true) && mTwoPane) - { + if (intent.getBooleanExtra(EXTRA_DISPLAY_TASK, false) && intent.getBooleanExtra(EXTRA_FORCE_LIST_SELECTION, true) && mTwoPane) { mShouldSwitchToDetail = true; mSelectedTaskUriOnLaunch = intent.getData(); mShouldSelectTaskListItem = true; - if (mPagerAdapter != null) - { + if (mPagerAdapter != null) { mPagerAdapter.notifyDataSetChanged(); } - } - else - { + } else { mSelectedTaskUriOnLaunch = null; mShouldSelectTaskListItem = false; } @@ -522,10 +468,8 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent) - { - if (resultCode == RESULT_OK && intent != null && intent.getData() != null) - { + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (resultCode == RESULT_OK && intent != null && intent.getData() != null) { // Use the same flow to display the new task as if it was opened from the widget Intent displayIntent = new Intent(this, TaskListActivity.class); displayIntent.putExtra(TaskListActivity.EXTRA_DISPLAY_TASK, !intent.getBooleanExtra(EditTaskFragment.KEY_NEW_TASK, false)); @@ -543,12 +487,10 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onTaskEditRequested(@NonNull Uri taskUri, ContentSet data) - { + public void onTaskEditRequested(@NonNull Uri taskUri, ContentSet data) { Intent editTaskIntent = new Intent(Intent.ACTION_EDIT); editTaskIntent.setData(taskUri); - if (data != null) - { + if (data != null) { Bundle extraBundle = new Bundle(); extraBundle.putParcelable(EditTaskActivity.EXTRA_DATA_CONTENT_SET, data); editTaskIntent.putExtra(EditTaskActivity.EXTRA_DATA_BUNDLE, extraBundle); @@ -558,13 +500,11 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onTaskDeleted(@NonNull Uri taskUri) - { + public void onTaskDeleted(@NonNull Uri taskUri) { if (taskUri.equals(mSelectedTaskUri)) // Only the selected task can be deleted on the UI, but just to be safe { mSelectedTaskUri = null; - if (mTwoPane) - { + if (mTwoPane) { // empty the detail fragment replaceTaskDetailsFragment(EmptyTaskFragment.newInstance(new ValueColor(mLastUsedColor))); } @@ -574,8 +514,7 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public void onTaskCompleted(@NonNull Uri taskUri) - { + public void onTaskCompleted(@NonNull Uri taskUri) { /* TODO We delegate to onTaskDeleted() which was used previously for this event, too. This causes the removal of details view, but the task is selected again if completed tasks are shown. This causes a flash. */ onTaskDeleted(taskUri); @@ -584,22 +523,18 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @SuppressLint("NewApi") @Override - public void onListColorLoaded(@NonNull Color color) - { + public void onListColorLoaded(@NonNull Color color) { mLastUsedColor = color.argb(); - if (mTwoPane) - { + if (mTwoPane) { int colorInt = color.argb(); getSupportActionBar().setBackgroundDrawable(new ColorDrawable(colorInt)); mTabs.setBackgroundColor(colorInt); - if (mAppBarLayout != null) - { + if (mAppBarLayout != null) { mAppBarLayout.setBackgroundColor(colorInt); } - if (VERSION.SDK_INT >= 21) - { + if (VERSION.SDK_INT >= 21) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(new DarkenedForStatusBar(color).argb()); @@ -609,14 +544,12 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public boolean onCreateOptionsMenu(Menu menu) - { + public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.task_list_activity_menu, menu); MenuItem addItem = menu.findItem(R.id.menu_add_task); - if (addItem != null && mFloatingActionButton != null) - { + if (addItem != null && mFloatingActionButton != null) { // hide menu option to add a task if we have a floating action button addItem.setVisible(false); } @@ -629,28 +562,19 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public boolean onOptionsItemSelected(MenuItem item) - { + public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.menu_add_task) - { + if (id == R.id.menu_add_task) { onAddNewTask(); return true; - } - else if (item.getItemId() == R.id.menu_visible_list) - { + } else if (item.getItemId() == R.id.menu_visible_list) { Intent settingsIntent = new Intent(getBaseContext(), SyncSettingsActivity.class); startActivity(settingsIntent); return true; - } - else if (item.getItemId() == R.id.opentasks_menu_app_settings) - { - if (VERSION.SDK_INT < 26) - { + } else if (item.getItemId() == R.id.opentasks_menu_app_settings) { + if (VERSION.SDK_INT < 26) { startActivity(new Intent(this, AppSettingsActivity.class)); - } - else - { + } else { // for now just open the notification settings, which is all we currently support anyway Intent intent = new Intent(); intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); @@ -658,40 +582,35 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C startActivity(intent); } return true; - } - else - { + } else if (item.getItemId() == R.id.opentasks_menu_app_about) { + startActivity(new Intent(this, AboutActivity.class)); + return true; + } else { return super.onOptionsItemSelected(item); } } - private void hideSearchActionView() - { + private void hideSearchActionView() { MenuItemCompat.collapseActionView(mSearchItem); } - public void setupSearch(Menu menu) - { + public void setupSearch(Menu menu) { mSearchItem = menu.findItem(R.id.search); - MenuItemCompat.setOnActionExpandListener(mSearchItem, new OnActionExpandListener() - { + MenuItemCompat.setOnActionExpandListener(mSearchItem, new OnActionExpandListener() { @Override - public boolean onMenuItemActionExpand(MenuItem item) - { + public boolean onMenuItemActionExpand(MenuItem item) { // always allow expansion of the search action view return mCurrentPageId == R.id.task_group_search; } @Override - public boolean onMenuItemActionCollapse(MenuItem item) - { + public boolean onMenuItemActionCollapse(MenuItem item) { // return to previous view - if (mPreviousPagePosition >= 0 && mCurrentPageId == R.id.task_group_search) - { + if (mPreviousPagePosition >= 0 && mCurrentPageId == R.id.task_group_search) { mViewPager.setCurrentItem(mPreviousPagePosition); mCurrentPageId = mPagerAdapter.getPageId(mPreviousPagePosition); } @@ -701,19 +620,16 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C SearchView searchView = (SearchView) MenuItemCompat.getActionView(mSearchItem); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); - if (null != searchManager) - { + if (null != searchManager) { searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); } searchView.setQueryHint(getString(R.string.menu_search_hint)); searchView.setIconified(true); - searchView.setOnQueryTextListener(new OnQueryTextListener() - { + searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override - public boolean onQueryTextSubmit(String query) - { + public boolean onQueryTextSubmit(String query) { // persist current search mSearchHistoryHelper.commitSearch(); mHandler.post(mSearchUpdater); @@ -722,21 +638,16 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C @Override - public boolean onQueryTextChange(String query) - { - if (mCurrentPageId != R.id.task_group_search) - { + public boolean onQueryTextChange(String query) { + if (mCurrentPageId != R.id.task_group_search) { return true; } mHandler.removeCallbacks(mSearchUpdater); - if (query.length() > 0) - { + if (query.length() > 0) { mSearchHistoryHelper.updateSearch(query); mHandler.postDelayed(mSearchUpdater, SEARCH_UPDATE_DELAY); - } - else - { + } else { mSearchHistoryHelper.removeCurrentSearch(); mHandler.post(mSearchUpdater); } @@ -744,8 +655,7 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C } }); - if (mAutoExpandSearchView) - { + if (mAutoExpandSearchView) { mSearchItem.expandActionView(); } @@ -755,12 +665,10 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C /** * Notifies the search fragment of an update. */ - private final Runnable mSearchUpdater = new Runnable() - { + private final Runnable mSearchUpdater = new Runnable() { @Override - public void run() - { + public void run() { TaskListFragment fragment = (TaskListFragment) mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem()); fragment.notifyDataSetChanged(true); fragment.expandCurrentSearchGroup(); @@ -768,18 +676,15 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C }; - public Uri getSelectedTaskUri() - { - if (mShouldSelectTaskListItem) - { + public Uri getSelectedTaskUri() { + if (mShouldSelectTaskListItem) { return mSelectedTaskUriOnLaunch; } return null; } - public boolean isInTransientState() - { + public boolean isInTransientState() { return mTransientState; } } diff --git a/opentasks/src/main/res/layout/activity_about.xml b/opentasks/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000000000000000000000000000000000000..155f0376c4b0e35c5a1f91405db5d27567604ac5 --- /dev/null +++ b/opentasks/src/main/res/layout/activity_about.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/opentasks/src/main/res/menu/task_list_activity_menu.xml b/opentasks/src/main/res/menu/task_list_activity_menu.xml index 7e2d40bf2f1f455055e536cafcb1c67727e09eec..e3b340fbf761e11f8f4ded4c34adc0f2a1d9c5e5 100644 --- a/opentasks/src/main/res/menu/task_list_activity_menu.xml +++ b/opentasks/src/main/res/menu/task_list_activity_menu.xml @@ -1,27 +1,32 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:id="@+id/menu_add_task" + android:icon="@drawable/ic_action_add" + android:title="@string/menu_add_task" + android:titleCondensed="@string/menu_add_task_condensed" + app:showAsAction="ifRoom" /> + android:id="@+id/search" + android:title="@string/task_group_search_title" + android:visible="false" + app:actionViewClass="androidx.appcompat.widget.SearchView" + app:showAsAction="collapseActionView" /> + android:id="@+id/menu_visible_list" + android:title="@string/visible_task_lists" + app:showAsAction="never" /> + android:id="@+id/opentasks_menu_app_settings" + android:title="@string/title_activity_settings" + app:showAsAction="never" /> + + \ No newline at end of file diff --git a/opentasks/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/opentasks/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 19f8f2e0ca99ae41638017aee2e673dd2b30bcf2..0000000000000000000000000000000000000000 --- a/opentasks/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/opentasks/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/opentasks/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 19f8f2e0ca99ae41638017aee2e673dd2b30bcf2..0000000000000000000000000000000000000000 --- a/opentasks/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/opentasks/src/main/res/mipmap-hdpi/ic_launcher.png b/opentasks/src/main/res/mipmap-hdpi/ic_launcher.png index 46751c7095abf7c764b96627ae7370061d8e5c20..0844fb5de5c06a69de8516df1039099c84180b36 100644 Binary files a/opentasks/src/main/res/mipmap-hdpi/ic_launcher.png and b/opentasks/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/opentasks/src/main/res/mipmap-hdpi/ic_launcher_round.png b/opentasks/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 4214582c6907be9a234b6c6a4337c40c21d8b546..0000000000000000000000000000000000000000 Binary files a/opentasks/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/opentasks/src/main/res/mipmap-ldpi/ic_launcher.png b/opentasks/src/main/res/mipmap-ldpi/ic_launcher.png index 92a4b45041da17117a616990d0289ee4099d6019..65bf9c8b12371bf1ceb303397ddc9c8018ccb952 100644 Binary files a/opentasks/src/main/res/mipmap-ldpi/ic_launcher.png and b/opentasks/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/opentasks/src/main/res/mipmap-ldpi/ic_launcher_round.png b/opentasks/src/main/res/mipmap-ldpi/ic_launcher_round.png deleted file mode 100644 index ee24d0262a8f38da9ec6294b253bbd0829e01247..0000000000000000000000000000000000000000 Binary files a/opentasks/src/main/res/mipmap-ldpi/ic_launcher_round.png and /dev/null differ diff --git a/opentasks/src/main/res/mipmap-mdpi/ic_launcher.png b/opentasks/src/main/res/mipmap-mdpi/ic_launcher.png index aeefd186383a3196ada03ac4b9b1fafb44822020..65bf9c8b12371bf1ceb303397ddc9c8018ccb952 100644 Binary files a/opentasks/src/main/res/mipmap-mdpi/ic_launcher.png and b/opentasks/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/opentasks/src/main/res/mipmap-mdpi/ic_launcher_round.png b/opentasks/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 0b26333447fd82270eb12fc88dda8e69e8fff502..0000000000000000000000000000000000000000 Binary files a/opentasks/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/opentasks/src/main/res/mipmap-xhdpi/ic_launcher.png b/opentasks/src/main/res/mipmap-xhdpi/ic_launcher.png index 008ea9a48b1ab0e42634f2864ede87f1743ebcdc..7fa0b8755aa62dace4a435303d943f028484adac 100644 Binary files a/opentasks/src/main/res/mipmap-xhdpi/ic_launcher.png and b/opentasks/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/opentasks/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/opentasks/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index e85e93c0151382c9f06dfd7d202e8b1cb8b42fde..0000000000000000000000000000000000000000 Binary files a/opentasks/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher.png b/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher.png index e011f6cb37223dbb03473159e06d2ee0efe2a1dd..bf42e0e1b9613fd4ab4f2da803991445f5601435 100644 Binary files a/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index e31ed7381464cf70c8cf29bbfa7477555f220395..0000000000000000000000000000000000000000 Binary files a/opentasks/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher.png index e70bac25cc7bfc8e592b29088b7128f3fd1c8bd5..7a706a717600d1a78c3a0d5384b64a166f48a64e 100644 Binary files a/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 36a2915f78677696c6f1300f48bb70c7958e60d9..0000000000000000000000000000000000000000 Binary files a/opentasks/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/opentasks/src/main/res/values-cs/strings.xml b/opentasks/src/main/res/values-cs/strings.xml index 57e7b52a310726ccca8ac64c1d3e99404240abac..d7395c0d65cf9c9dba3ccc068ece5bde363962f9 100644 --- a/opentasks/src/main/res/values-cs/strings.xml +++ b/opentasks/src/main/res/values-cs/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Přidat úkol @@ -250,5 +250,14 @@ Vytvořit úkol %1$s %2$s + Informace o úkolu + Sestavte verzi + Tasks is forked from OpenTasks + Licence + Autoři + Zdrojový kód + Zásady ochrany osobních údajů + Podmínky služby + Asi diff --git a/opentasks/src/main/res/values-cy/strings.xml b/opentasks/src/main/res/values-cy/strings.xml index 6c663366effb5eaacf2f9b91b61a629cfe77b4e8..2aa102748209f6b54ec4758ae7411423d41ce2c6 100644 --- a/opentasks/src/main/res/values-cy/strings.xml +++ b/opentasks/src/main/res/values-cy/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Ychwanegu tasg @@ -289,5 +289,14 @@ Dyddiadau dechrau a therfyn + Gwybodaeth am y dasg + Adeiladu fersiwn + Tasks is forked from OpenTasks + Trwydded + Awduron + Cod ffynhonnell + Polisi preifatrwydd + Telerau gwasanaeth + Am diff --git a/opentasks/src/main/res/values-da/strings.xml b/opentasks/src/main/res/values-da/strings.xml index 64b5cb745723886aa1b29b67a9be8792e5cbf657..3ef3c21e2a2480b84a30c6bf820a8b2d1c2ceaa4 100644 --- a/opentasks/src/main/res/values-da/strings.xml +++ b/opentasks/src/main/res/values-da/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Tilføj opgave @@ -285,5 +285,14 @@ Start og forfaldsdatoer + Opgaveinformation + Build version + Tasks is forked from OpenTasks + Licens + Forfattere + Kildekode + Fortrolighedspolitik + Servicevilkår + cirka diff --git a/opentasks/src/main/res/values-de/strings.xml b/opentasks/src/main/res/values-de/strings.xml index e6f1b7dd3ab38e0421493d5656e48c5f50d9e3f5..f8a47131227ee96ddb72b055f99b39f589747035 100644 --- a/opentasks/src/main/res/values-de/strings.xml +++ b/opentasks/src/main/res/values-de/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Neue Aufgabe @@ -276,5 +276,14 @@ Angeheftete Aufgaben Beginn und Fälligkeiten + Aufgabeninformationen + Build-Version + Tasks is forked from OpenTasks + Lizenz + Autor + Quellcode + Datenschutz-Bestimmungen + Nutzungsbedingungen + Über diff --git a/opentasks/src/main/res/values-es/strings.xml b/opentasks/src/main/res/values-es/strings.xml index 10e74052b3be730245e24b498b485966af54e989..402cf3fc40834193896b386857f8e57b6532b67d 100644 --- a/opentasks/src/main/res/values-es/strings.xml +++ b/opentasks/src/main/res/values-es/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Añadir tarea @@ -250,5 +250,14 @@ Crear Tarea + Información de la tarea + Versión de compilación + Tasks is forked from OpenTasks + Licencia + autor + Código fuente + Política de privacidad + Términos de servicio + Acerca de diff --git a/opentasks/src/main/res/values-fr/strings.xml b/opentasks/src/main/res/values-fr/strings.xml index 2d0fcabfc37b87f5b04df3fda6ffb7b83b66440c..06c3e25c51e6933a9ca8467959cc67ad9ea8f3ae 100644 --- a/opentasks/src/main/res/values-fr/strings.xml +++ b/opentasks/src/main/res/values-fr/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Ajouter une tâche @@ -249,5 +249,14 @@ Ajouter une tâche %1$s à %2$s + Informations sur la tâche + Créer une version + Tasks is forked from OpenTasks + Licence + auteurs + Code source + Politique de confidentialité + Conditions d\'utilisation + À propos diff --git a/opentasks/src/main/res/values-hu/strings.xml b/opentasks/src/main/res/values-hu/strings.xml index edd5085fc6cfea07549eaee28f7844ce7813f36e..f212ccc8988c151d5d8624224627e53a065e06f4 100644 --- a/opentasks/src/main/res/values-hu/strings.xml +++ b/opentasks/src/main/res/values-hu/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Feladat hozzáadása @@ -254,5 +254,14 @@ OpenTasks-al küldve %1$s %2$s + feladat információ + Összeállított verzió + Tasks is forked from OpenTasks + Engedély + Szerzői + Forráskód + Adatvédelmi irányelvek + Szolgáltatási feltételek + körülbelül diff --git a/opentasks/src/main/res/values-it/strings.xml b/opentasks/src/main/res/values-it/strings.xml index f2498c29626040aea645a0a6e8ead016c3f56fbd..af8e18f3827db98d4a443c1cc4c051d3796d23d9 100644 --- a/opentasks/src/main/res/values-it/strings.xml +++ b/opentasks/src/main/res/values-it/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Aggiungi avvitià @@ -285,5 +285,14 @@ Date di inizio e scadenza + Informazioni sull\'attività + Versione build + Tasks is forked from OpenTasks + Licenza + autore + Codice sorgente + Politica sulla riservatezza + Termini di servizio + su diff --git a/opentasks/src/main/res/values-ja/strings.xml b/opentasks/src/main/res/values-ja/strings.xml index a6d30ec871e20fca304deb836fd646b7ce9ef34b..382e405922f5fe203c7d4c968f9101fe5611adb1 100644 --- a/opentasks/src/main/res/values-ja/strings.xml +++ b/opentasks/src/main/res/values-ja/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks すべてのタスク @@ -250,5 +250,14 @@ %1$s %2$s %1$s %2$s + タスク情報 + ビルドバージョン + Tasks is forked from OpenTasks + ライセンス + 著者 + ソースコード + 個人情報保護方針 + 利用規約 + について diff --git a/opentasks/src/main/res/values-nl/strings.xml b/opentasks/src/main/res/values-nl/strings.xml index 1985cf212608e30901281c3093d00588a262c8f8..80eb39c33aae83a0e020f0c0316efc161fbbccb6 100644 --- a/opentasks/src/main/res/values-nl/strings.xml +++ b/opentasks/src/main/res/values-nl/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Voeg taak toe @@ -277,5 +277,14 @@ Start- en einddata + Taak informatie + Build-versie + Tasks is forked from OpenTasks + Licentie + Auteurs + Broncode + Privacybeleid + Servicevoorwaarden + Over diff --git a/opentasks/src/main/res/values-pl/strings.xml b/opentasks/src/main/res/values-pl/strings.xml index 9b54738c1f783db9639df3d487822235957f028b..607c342dd6961deb85ab66b7c623d60d0d55a1c9 100644 --- a/opentasks/src/main/res/values-pl/strings.xml +++ b/opentasks/src/main/res/values-pl/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Dodaj zadanie @@ -241,5 +241,14 @@ Dodaj zadanie %1$s %2$s + Informacje o zadaniu + Wersja kompilacji + Tasks is forked from OpenTasks + Licencja + Autorski + Kod źródłowy + Polityka prywatności + Warunki usługi + O mnie diff --git a/opentasks/src/main/res/values-pt-rPT/strings.xml b/opentasks/src/main/res/values-pt-rPT/strings.xml index 686cd8ba4e5fcbe0a2e08c66e72d8c3f1af8d975..7888bd3f5b5562d84d8fecb243b48d2526ee062c 100644 --- a/opentasks/src/main/res/values-pt-rPT/strings.xml +++ b/opentasks/src/main/res/values-pt-rPT/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Adicionar tarefa @@ -261,5 +261,14 @@ Luz %1$s %2$s + Informações da tarefa + Versão de compilação + Tasks is forked from OpenTasks + Licença + Autor + Código fonte + Política de Privacidade + Termos de serviço + Sobre \ No newline at end of file diff --git a/opentasks/src/main/res/values-pt-rbr/strings.xml b/opentasks/src/main/res/values-pt-rbr/strings.xml index 6a2239d685214b89210a5ba603f6934fb7fc282c..1b9ca67217cc566cf026e66cf1bd5be7b5564c42 100644 --- a/opentasks/src/main/res/values-pt-rbr/strings.xml +++ b/opentasks/src/main/res/values-pt-rbr/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Adicionar tarefa @@ -239,5 +239,14 @@ Adicionar tarefa %1$s %2$s + Informações da tarefa + Versão de compilação + Tasks is forked from OpenTasks + Licença + Autor + Código fonte + Política de Privacidade + Termos de serviço + Sobre diff --git a/opentasks/src/main/res/values-ru/strings.xml b/opentasks/src/main/res/values-ru/strings.xml index e07f9c5fb4d3d09e8dd37b883c490011ed3d7f4b..35a56b61b4b9a6cd743e011eb86fb978c37cd9f0 100644 --- a/opentasks/src/main/res/values-ru/strings.xml +++ b/opentasks/src/main/res/values-ru/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Добавить задачу @@ -287,5 +287,14 @@ Даты начала и срока выполнения + Информация о задании + Версия сборки + Tasks is forked from OpenTasks + Лицензия + Авторы + Исходный код + Политика конфиденциальности + Условия обслуживания + о diff --git a/opentasks/src/main/res/values-sk/strings.xml b/opentasks/src/main/res/values-sk/strings.xml index 1860a18d0843844407f97c3fd6a863411210fcab..63735b963ff5f9973387aa9101ba62b6c5e80a26 100644 --- a/opentasks/src/main/res/values-sk/strings.xml +++ b/opentasks/src/main/res/values-sk/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Pridať úlohu @@ -251,5 +251,14 @@ Vytvoriť úlohu %2$s %1$s + Informácie o úlohe + Zostaviť verziu + Tasks is forked from OpenTasks + licencie + Autori + Zdrojový kód + Zásady ochrany osobných údajov + Podmienky služby + o diff --git a/opentasks/src/main/res/values-sr/strings.xml b/opentasks/src/main/res/values-sr/strings.xml index 0aa80a2a24c05d03ed06aae1cd5a4a6efdab7c93..a551defae79d6cbecd827dcb7f82f282dfcb2a3b 100644 --- a/opentasks/src/main/res/values-sr/strings.xml +++ b/opentasks/src/main/res/values-sr/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Додај задатак @@ -239,5 +239,14 @@ Додај задатак %2$s %1$s + Информације о задатку + Изградња верзије + Tasks is forked from OpenTasks + Лиценца + Аутори + Изворни код + Правила о приватности + Услови коришћења + О: diff --git a/opentasks/src/main/res/values-sv-rSE/strings.xml b/opentasks/src/main/res/values-sv-rSE/strings.xml index 108a197036e25b00349db4b2b862feec7043b39b..8ffdd1fbb57c5fd698912199615c29f35fc0a8c0 100644 --- a/opentasks/src/main/res/values-sv-rSE/strings.xml +++ b/opentasks/src/main/res/values-sv-rSE/strings.xml @@ -16,7 +16,7 @@ --> - OpenTasks + Tasks Lägg till %1s skapad. %1s borttagen. @@ -199,4 +199,13 @@ Uppgiften förfaller idag Uppgiften startar idag Notera att detta skapar en lokal lista. Uppgifter i listan kommer inte att synkroniseras. + Uppgiftsinformation + Bygg version + Tasks is forked from OpenTasks + Licens + Författare + Integritetspolicy + Användarvillkor + om + Källkod \ No newline at end of file diff --git a/opentasks/src/main/res/values-uk/strings.xml b/opentasks/src/main/res/values-uk/strings.xml index b3254bedcfa6528e7a54352c4bc2dabd5fb9ecbf..e2936ad1aa324544dd256ff0b8bba0485f43569e 100644 --- a/opentasks/src/main/res/values-uk/strings.xml +++ b/opentasks/src/main/res/values-uk/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Додати завдання @@ -239,5 +239,14 @@ Нове завдання %2$s %1$s + Інформація про завдання + Збірка версії + Tasks is forked from OpenTasks + Ліцензія + Автори + Вихідний код + Політика конфіденційності + Умови обслуговування + Про diff --git a/opentasks/src/main/res/values-zh-rCN/strings.xml b/opentasks/src/main/res/values-zh-rCN/strings.xml index 8a9997a4c7b1c6d37244e540872e9e14f2bd8a41..90eddd3091c13958940121fadbd2cd0788b9923d 100644 --- a/opentasks/src/main/res/values-zh-rCN/strings.xml +++ b/opentasks/src/main/res/values-zh-rCN/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks 添加任务 @@ -276,5 +276,14 @@ %1$s, %2$s %1$s, %2$s + 任务信息 + 版本 + Tasks is forked from OpenTasks + 执照 + 作者 + 源代码 + 隐私政策 + 服务条款 + 关于 diff --git a/opentasks/src/main/res/values/strings.xml b/opentasks/src/main/res/values/strings.xml index 4821a10438dc08279374981063511beebd5b10b8..00f39863eff3099fbe20ec34923cac4534fcdeb8 100644 --- a/opentasks/src/main/res/values/strings.xml +++ b/opentasks/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ - OpenTasks + Tasks Add task @@ -149,6 +149,7 @@ Settings + About Settings Add List Displayed Lists @@ -286,4 +287,17 @@ Start and due dates + + + About + Task information + Build version + Tasks is forked from OpenTasks + Licence + Source code + Privacy policy + Terms of service + An Open Source Task App for Android + Authors + diff --git a/opentasks/src/main/res/xml/about_preferences.xml b/opentasks/src/main/res/xml/about_preferences.xml new file mode 100644 index 0000000000000000000000000000000000000000..c15d1703885096a801bb46ad69dd67e081f4d2a0 --- /dev/null +++ b/opentasks/src/main/res/xml/about_preferences.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +