jenkins-bot has submitted this change and it was merged.
Change subject: Add user options database to dev settings
......................................................................
Add user options database to dev settings
Change-Id: I11f8955aebd4e2f7d725a4860033dd80cf3b78b6
---
M app/src/main/AndroidManifest.xml
M app/src/main/java/org/wikipedia/Constants.java
A app/src/main/java/org/wikipedia/database/CursorAdapterLoaderCallback.java
M
app/src/main/java/org/wikipedia/settings/DeveloperSettingsPreferenceLoader.java
A app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowActivity.java
A app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowCursorAdapter.java
A app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowFragment.java
A app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowView.java
A app/src/main/res/layout/fragment_user_option_row.xml
A app/src/main/res/layout/view_user_option_row.xml
A app/src/main/res/menu/menu_user_option.xml
M app/src/main/res/values/dev_settings_strings.xml
M app/src/main/res/xml/developer_preferences.xml
13 files changed, 410 insertions(+), 0 deletions(-)
Approvals:
Dbrant: Looks good to me, approved
jenkins-bot: Verified
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index adb8eb0..3e970f1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -140,6 +140,9 @@
<data android:pathPrefix="/android_asset/licenses/"
android:scheme="file" />
</intent-filter>
</activity>
+ <activity
+ android:name=".useroption.ui.UserOptionRowActivity"
+ android:label="@string/user_option_activity_title" />
<provider
android:authorities="@string/history_authority"
diff --git a/app/src/main/java/org/wikipedia/Constants.java
b/app/src/main/java/org/wikipedia/Constants.java
index 2786682..ca6ea49 100644
--- a/app/src/main/java/org/wikipedia/Constants.java
+++ b/app/src/main/java/org/wikipedia/Constants.java
@@ -6,6 +6,7 @@
public static final int HISTORY_FRAGMENT_LOADER_ID = 100;
public static final int SAVED_PAGES_FRAGMENT_LOADER_ID = 101;
public static final int RECENT_SEARCHES_FRAGMENT_LOADER_ID = 102;
+ public static final int USER_OPTION_ROW_FRAGMENT_LOADER_ID = 103;
private Constants() { }
}
\ No newline at end of file
diff --git
a/app/src/main/java/org/wikipedia/database/CursorAdapterLoaderCallback.java
b/app/src/main/java/org/wikipedia/database/CursorAdapterLoaderCallback.java
new file mode 100644
index 0000000..67a5bf4
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/database/CursorAdapterLoaderCallback.java
@@ -0,0 +1,32 @@
+package org.wikipedia.database;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.support.annotation.NonNull;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.Loader;
+import android.support.v4.widget.CursorAdapter;
+
+public abstract class CursorAdapterLoaderCallback implements
LoaderManager.LoaderCallbacks<Cursor> {
+ @NonNull private final Context context;
+ @NonNull private final CursorAdapter adapter;
+
+ public CursorAdapterLoaderCallback(@NonNull Context context, @NonNull
CursorAdapter adapter) {
+ this.context = context.getApplicationContext();
+ this.adapter = adapter;
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+ adapter.swapCursor(cursor);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ adapter.changeCursor(null);
+ }
+
+ @NonNull protected Context context() {
+ return context;
+ }
+}
\ No newline at end of file
diff --git
a/app/src/main/java/org/wikipedia/settings/DeveloperSettingsPreferenceLoader.java
b/app/src/main/java/org/wikipedia/settings/DeveloperSettingsPreferenceLoader.java
index 2b8e398..686be06 100644
---
a/app/src/main/java/org/wikipedia/settings/DeveloperSettingsPreferenceLoader.java
+++
b/app/src/main/java/org/wikipedia/settings/DeveloperSettingsPreferenceLoader.java
@@ -10,6 +10,7 @@
import org.wikipedia.R;
import org.wikipedia.WikipediaApp;
import org.wikipedia.crash.RemoteLogException;
+import org.wikipedia.useroption.ui.UserOptionRowActivity;
import org.wikipedia.util.log.L;
import java.util.List;
@@ -48,6 +49,7 @@
setUpCookies((PreferenceCategory)
findPreference(R.string.preferences_developer_cookies_key));
setUpEditTokens((PreferenceCategory)
findPreference(R.string.preferences_developer_edit_tokens_key));
setUpCrashButton(findPreference(getCrashButtonKey()));
+ setUpUserOptionButton(findPreference(getUserOptionButtonKey()));
setUpRemoteLogButton(findPreference(R.string.preference_key_remote_log));
}
@@ -80,8 +82,16 @@
return context.getString(R.string.preferences_developer_crash_key);
}
+ private String getUserOptionButtonKey() {
+ return
context.getString(R.string.preferences_developer_user_option_key);
+ }
+
private void setUpCrashButton(Preference button) {
button.setOnPreferenceClickListener(buildCrashButtonClickListener());
+ }
+
+ private void setUpUserOptionButton(Preference button) {
+
button.setOnPreferenceClickListener(buildUserOptionButtonClickListener());
}
private Preference.OnPreferenceClickListener
buildCrashButtonClickListener() {
@@ -93,6 +103,16 @@
};
}
+ private Preference.OnPreferenceClickListener
buildUserOptionButtonClickListener() {
+ return new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+
context.startActivity(UserOptionRowActivity.newIntent(context));
+ return true;
+ }
+ };
+ }
+
private void setUpRemoteLogButton(Preference button) {
button.setOnPreferenceChangeListener(buildRemoteLogPreferenceChangeListener());
}
diff --git
a/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowActivity.java
b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowActivity.java
new file mode 100644
index 0000000..cec5388
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowActivity.java
@@ -0,0 +1,25 @@
+package org.wikipedia.useroption.ui;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+
+import org.wikipedia.activity.CompatSingleFragmentActivity;
+import org.wikipedia.activity.FragmentCallback;
+
+public class UserOptionRowActivity extends
CompatSingleFragmentActivity<UserOptionRowFragment>
+ implements FragmentCallback {
+ public static Intent newIntent(@NonNull Context context) {
+ return new Intent().setClass(context, UserOptionRowActivity.class);
+ }
+
+ @Override
+ protected UserOptionRowFragment createFragment() {
+ return UserOptionRowFragment.newInstance();
+ }
+
+ @Override
+ protected void setTheme() {
+ setActionBarTheme();
+ }
+}
\ No newline at end of file
diff --git
a/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowCursorAdapter.java
b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowCursorAdapter.java
new file mode 100644
index 0000000..5a1f259
--- /dev/null
+++
b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowCursorAdapter.java
@@ -0,0 +1,28 @@
+package org.wikipedia.useroption.ui;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.support.v4.widget.CursorAdapter;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.wikipedia.useroption.database.UserOptionRow;
+import org.wikipedia.useroption.database.UserOptionDatabaseTable;
+
+public class UserOptionRowCursorAdapter extends CursorAdapter {
+ public UserOptionRowCursorAdapter(Context context, Cursor cursor, boolean
autoRequery) {
+ super(context, cursor, autoRequery);
+ }
+
+ @Override
+ public UserOptionRowView newView(Context context, Cursor cursor, ViewGroup
parent) {
+ return new UserOptionRowView(context);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ UserOptionRow item = UserOptionRow.DATABASE_TABLE.fromCursor(cursor);
+ UserOptionRowView v = (UserOptionRowView) view;
+ v.set(UserOptionDatabaseTable.Col.ID.val(cursor), item);
+ }
+}
\ No newline at end of file
diff --git
a/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowFragment.java
b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowFragment.java
new file mode 100644
index 0000000..52c39e7
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowFragment.java
@@ -0,0 +1,91 @@
+package org.wikipedia.useroption.ui;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.widget.CursorAdapter;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import org.wikipedia.R;
+import org.wikipedia.activity.CallbackFragment;
+import org.wikipedia.activity.FragmentCallback;
+import org.wikipedia.database.CursorAdapterLoaderCallback;
+import org.wikipedia.useroption.database.UserOptionDatabaseTable;
+import org.wikipedia.useroption.database.UserOptionRow;
+import org.wikipedia.useroption.sync.UserOptionContentResolver;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+import static org.wikipedia.Constants.USER_OPTION_ROW_FRAGMENT_LOADER_ID;
+
+public class UserOptionRowFragment extends CallbackFragment<FragmentCallback> {
+ @Bind(R.id.fragment_user_option_list) ListView list;
+
+ public static UserOptionRowFragment newInstance() {
+ return new UserOptionRowFragment();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+
+ View view = inflater.inflate(R.layout.fragment_user_option_row,
container, false);
+ ButterKnife.bind(this, view);
+
+ CursorAdapter listAdapter = new
UserOptionRowCursorAdapter(getContext(), null, true);
+ list.setAdapter(listAdapter);
+
+ LoaderCallback callback = new LoaderCallback(getContext(),
listAdapter);
+
getActivity().getSupportLoaderManager().initLoader(USER_OPTION_ROW_FRAGMENT_LOADER_ID,
null, callback);
+
+ setHasOptionsMenu(true);
+
+ return view;
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.menu_user_option, menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_user_option_sync_all:
+ UserOptionContentResolver.requestManualSync();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private static class LoaderCallback extends CursorAdapterLoaderCallback {
+ LoaderCallback(@NonNull Context context, @NonNull CursorAdapter
adapter) {
+ super(context, adapter);
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ Uri uri = UserOptionRow.DATABASE_TABLE.getBaseContentURI();
+ String[] projection = null;
+ String selection = null;
+ String[] selectionArgs = null;
+ String order = UserOptionDatabaseTable.Col.ID.getName() + " desc";
+ return new CursorLoader(context(), uri, projection, selection,
selectionArgs, order);
+ }
+ }
+}
\ No newline at end of file
diff --git
a/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowView.java
b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowView.java
new file mode 100644
index 0000000..f2e9e27
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/useroption/ui/UserOptionRowView.java
@@ -0,0 +1,67 @@
+package org.wikipedia.useroption.ui;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.wikipedia.R;
+import org.wikipedia.database.sync.DefaultSyncRow;
+import org.wikipedia.useroption.database.UserOptionRow;
+
+import java.util.concurrent.TimeUnit;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+public class UserOptionRowView extends LinearLayout {
+ @Bind(R.id.view_user_option_id) TextView id;
+ @Bind(R.id.view_user_option_key) TextView key;
+ @Bind(R.id.view_user_option_value) TextView value;
+ @Bind(R.id.view_user_option_status) TextView status;
+ @Bind(R.id.view_user_option_transaction_id) TextView transactionId;
+ @Bind(R.id.view_user_option_timestamp) TextView timestamp;
+
+ public UserOptionRowView(Context context) {
+ super(context);
+ init();
+ }
+
+ public UserOptionRowView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public UserOptionRowView(Context context, AttributeSet attrs, int
defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public UserOptionRowView(Context context, AttributeSet attrs, int
defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ public void set(long id, UserOptionRow option) {
+ this.id.setText(String.valueOf(id));
+ key.setText(option.key());
+ value.setText(String.valueOf(option.val()));
+ status.setText(option.status().toString());
+ status.setVisibility(option.status().synced() ? GONE : VISIBLE);
+ transactionId.setText(String.valueOf(option.transactionId()));
+ transactionId.setVisibility(option.transactionId() ==
DefaultSyncRow.NO_TRANSACTION_ID ? GONE : VISIBLE);
+ long age = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis()
- option.timestamp());
+ timestamp.setText(String.valueOf(age));
+ timestamp.setVisibility(option.timestamp() == 0 ? GONE : VISIBLE);
+ }
+
+ private void init() {
+ setGravity(Gravity.CENTER_VERTICAL);
+ inflate(getContext(), R.layout.view_user_option_row, this);
+ ButterKnife.bind(this);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_user_option_row.xml
b/app/src/main/res/layout/fragment_user_option_row.xml
new file mode 100644
index 0000000..14a35fa
--- /dev/null
+++ b/app/src/main/res/layout/fragment_user_option_row.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="4dp">
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#727272"
+ android:text="ID" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#0288d1"
+ android:text="Key" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#b3e5fc"
+ android:text="Value" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#8bc34a"
+ android:text="Status" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#03a9f4"
+ android:text="Transaction ID" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#b6b6b6"
+ android:text="Sync age (min)" />
+
+ </LinearLayout>
+
+ <ListView
+ android:id="@+id/fragment_user_option_list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_user_option_row.xml
b/app/src/main/res/layout/view_user_option_row.xml
new file mode 100644
index 0000000..2efb4b3
--- /dev/null
+++ b/app/src/main/res/layout/view_user_option_row.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:id="@+id/view_user_option_id"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:background="#727272"
+ tools:text="ID" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:id="@+id/view_user_option_key"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:background="#0288d1"
+ tools:text="Key" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:id="@+id/view_user_option_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:background="#b3e5fc"
+ tools:text="Value" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:id="@+id/view_user_option_status"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:background="#8bc34a"
+ tools:text="Status" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:id="@+id/view_user_option_transaction_id"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:background="#03a9f4"
+ tools:text="Transaction ID" />
+
+ <TextView
+ style="?android:textAppearanceMedium"
+ android:id="@+id/view_user_option_timestamp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:background="#b6b6b6"
+ tools:text="Timestamp" />
+
+</merge>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_user_option.xml
b/app/src/main/res/menu/menu_user_option.xml
new file mode 100644
index 0000000..bd49205
--- /dev/null
+++ b/app/src/main/res/menu/menu_user_option.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:id="@+id/menu_user_option_sync_all"
+ android:title="@string/menu_item_sync_all" />
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/values/dev_settings_strings.xml
b/app/src/main/res/values/dev_settings_strings.xml
index 8d82bc5..31fcf76 100644
--- a/app/src/main/res/values/dev_settings_strings.xml
+++ b/app/src/main/res/values/dev_settings_strings.xml
@@ -21,4 +21,9 @@
<string name="preferences_developer_session_timeout_title">Session timeout
(minutes)</string>
<string name="preferences_developer_remote_log_title">Remote
logging</string>
<string name="preferences_developer_remote_log_summary">Type a message to
send.</string>
+ <string name="preferences_developer_user_option_key">userOption</string>
+ <string name="preferences_developer_user_option_title">User
options</string>
+ <string name="preferences_developer_user_option_summary">Tap here to show
user options</string>
+ <string name="user_option_activity_title">User options</string>
+ <string name="menu_item_sync_all">Sync all</string>
</resources>
diff --git a/app/src/main/res/xml/developer_preferences.xml
b/app/src/main/res/xml/developer_preferences.xml
index 3362d52..39c5fab 100644
--- a/app/src/main/res/xml/developer_preferences.xml
+++ b/app/src/main/res/xml/developer_preferences.xml
@@ -106,6 +106,10 @@
<PreferenceCategory
android:title="@string/preferences_developer_misc_heading">
+ <Preference android:key="@string/preferences_developer_user_option_key"
+ android:title="@string/preferences_developer_user_option_title"
+
android:summary="@string/preferences_developer_user_option_summary" />
+
<!--suppress AndroidUnknownAttribute -->
<org.wikipedia.settings.EditTextAutoSummarizePreference
style="@style/DataStringPreference"
--
To view, visit https://gerrit.wikimedia.org/r/272803
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I11f8955aebd4e2f7d725a4860033dd80cf3b78b6
Gerrit-PatchSet: 7
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits