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

Reply via email to