From 4e4e30823fba0047b93a56bfcf05c04ca57e82ec Mon Sep 17 00:00:00 2001 From: liyuqian Date: Thu, 26 May 2016 12:43:43 -0700 Subject: Now we can use drawer to view the state information of the native app, and set its state using the spinner. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2004633002 Review-Url: https://codereview.chromium.org/2004633002 --- platform_tools/android/apps/viewer/build.gradle | 8 +- .../main/java/org/skia/viewer/StateAdapter.java | 114 +++++++++++++++++++++ .../main/java/org/skia/viewer/ViewerActivity.java | 54 +++++++++- .../java/org/skia/viewer/ViewerApplication.java | 31 +++++- .../viewer/src/main/res/layout/activity_main.xml | 43 +++++--- .../apps/viewer/src/main/res/layout/state_item.xml | 35 +++++++ .../apps/viewer/src/main/res/values/strings.xml | 5 + 7 files changed, 270 insertions(+), 20 deletions(-) create mode 100644 platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/StateAdapter.java create mode 100644 platform_tools/android/apps/viewer/src/main/res/layout/state_item.xml create mode 100644 platform_tools/android/apps/viewer/src/main/res/values/strings.xml (limited to 'platform_tools') diff --git a/platform_tools/android/apps/viewer/build.gradle b/platform_tools/android/apps/viewer/build.gradle index 79cac8a7d4..15cff2cb39 100644 --- a/platform_tools/android/apps/viewer/build.gradle +++ b/platform_tools/android/apps/viewer/build.gradle @@ -5,8 +5,14 @@ * found in the LICENSE file. */ apply plugin: 'com.android.application' + +dependencies { + compile 'com.android.support:support-v13:23.3.0' + compile 'com.android.support:appcompat-v7:23.3.0' +} + android { - compileSdkVersion 19 + compileSdkVersion 23 buildToolsVersion "22.0.1" defaultConfig { applicationId "org.skia.viewer" diff --git a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/StateAdapter.java b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/StateAdapter.java new file mode 100644 index 0000000000..4c9dcd4b84 --- /dev/null +++ b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/StateAdapter.java @@ -0,0 +1,114 @@ +package org.skia.viewer; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + +public class StateAdapter extends BaseAdapter implements AdapterView.OnItemSelectedListener { + static final String NAME = "name"; + static final String VALUE = "value"; + static final String OPTIONS = "options"; + + ViewerActivity mViewerActivity; + JSONArray mStateJson; + + public StateAdapter(ViewerActivity viewerActivity) { + mViewerActivity = viewerActivity; + try { + mStateJson = new JSONArray("[{\"name\": \"Please\", " + + "\"value\": \"Initialize\", \"options\": []}]"); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + public void setState(String stateJson) { + try { + mStateJson = new JSONArray(stateJson); + notifyDataSetChanged(); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + @Override + public int getCount() { + return mStateJson.length(); + } + + @Override + public Object getItem(int position) { + try { + return mStateJson.getJSONObject(position); + } catch (JSONException e) { + e.printStackTrace(); + return null; + } + } + + @Override + public long getItemId(int position) { + return 0; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(mViewerActivity).inflate(R.layout.state_item, null); + } + TextView nameText = (TextView) convertView.findViewById(R.id.nameText); + TextView valueText = (TextView) convertView.findViewById(R.id.valueText); + Spinner optionSpinner = (Spinner) convertView.findViewById(R.id.optionSpinner); + JSONObject stateObject = (JSONObject) getItem(position); + try { + nameText.setText(stateObject.getString(NAME)); + String value = stateObject.getString(VALUE); + JSONArray options = stateObject.getJSONArray(OPTIONS); + if (options.length() == 0) { + valueText.setText(value); + valueText.setVisibility(View.VISIBLE); + optionSpinner.setVisibility(View.GONE); + + } else { + ArrayList optionList = new ArrayList<>(); + String[] optionStrings = new String[options.length()]; + for(int i=0; i(mViewerActivity, + android.R.layout.simple_spinner_dropdown_item, optionList)); + optionSpinner.setSelection(optionList.indexOf(value)); + optionSpinner.setOnItemSelectedListener(this); + optionSpinner.setVisibility(View.VISIBLE); + valueText.setVisibility(View.GONE); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return convertView; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + View stateItem = (View) parent.getParent(); + String stateName = ((TextView) stateItem.findViewById(R.id.nameText)).getText().toString(); + String stateValue = ((TextView) view).getText().toString(); + mViewerActivity.onStateChanged(stateName, stateValue); + } + + @Override + public void onNothingSelected(AdapterView parent) { + // do nothing + } +} diff --git a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java index 49f711d517..ce5bb0deda 100644 --- a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java +++ b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java @@ -8,9 +8,10 @@ package org.skia.viewer; import android.app.Activity; +import android.content.res.Configuration; import android.os.Bundle; -import android.util.Log; -import android.view.GestureDetector; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; @@ -20,11 +21,17 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; +import android.widget.ListView; public class ViewerActivity extends Activity implements SurfaceHolder.Callback, View.OnTouchListener { private static final float FLING_VELOCITY_THRESHOLD = 1000; + private DrawerLayout mDrawerLayout; + private ActionBarDrawerToggle mDrawerToggle; + private ListView mDrawerList; + private StateAdapter mStateAdapter; + private SurfaceView mView; private ViewerApplication mApplication; @@ -33,6 +40,7 @@ public class ViewerActivity private native void onSurfaceDestroyed(long handle); private native void onKeyPressed(long handle, int keycode); private native void onTouched(long handle, int owner, int state, float x, float y); + private native void onUIStateChanged(long handle, String stateName, String stateValue); @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -43,6 +51,12 @@ public class ViewerActivity @Override public boolean onOptionsItemSelected(MenuItem item) { + // Pass the event to ActionBarDrawerToggle, if it returns + // true, then it has handled the app icon touch event + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + switch (item.getItemId()) { case R.id.action_left: onKeyPressed(mApplication.getNativeHandle(), KeyEvent.KEYCODE_SOFT_LEFT); @@ -60,12 +74,36 @@ public class ViewerActivity super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - mApplication = (ViewerApplication) getApplication(); - mApplication.setViewerActivity(this); mView = (SurfaceView) findViewById(R.id.surfaceView); mView.getHolder().addCallback(this); mView.setOnTouchListener(this); + + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.string.drawer_open, R.string.drawer_close); + mDrawerLayout.addDrawerListener(mDrawerToggle); + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + + mDrawerList = (ListView) findViewById(R.id.leftDrawer); + mStateAdapter = new StateAdapter(this); + mDrawerList.setAdapter(mStateAdapter); + + mApplication = (ViewerApplication) getApplication(); + mApplication.setViewerActivity(this); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); } @Override @@ -107,4 +145,12 @@ public class ViewerActivity } return true; } + + public void setState(String stateJson) { + mStateAdapter.setState(stateJson); + } + + public void onStateChanged(String stateName, String stateValue) { + onUIStateChanged(mApplication.getNativeHandle(), stateName, stateValue); + } } diff --git a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java index 4b890bd5e1..ee1695afd1 100644 --- a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java +++ b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerApplication.java @@ -12,6 +12,7 @@ import android.app.Application; public class ViewerApplication extends Application { private long mNativeHandle = 0; private ViewerActivity mViewerActivity; + private String mStateJsonStr, mTitle; static { System.loadLibrary("skia_android"); @@ -41,16 +42,40 @@ public class ViewerApplication extends Application { } public void setViewerActivity(ViewerActivity viewerActivity) { - this.mViewerActivity = viewerActivity; + mViewerActivity = viewerActivity; + // Note that viewerActivity might be null (called by onDestroy) + if (mViewerActivity != null) { + // A new ViewerActivity is created; initialize its state and title + if (mStateJsonStr != null) { + mViewerActivity.setState(mStateJsonStr); + } + if (mTitle != null) { + mViewerActivity.setTitle(mTitle); + } + } } public void setTitle(String title) { - final String finalTitle = title; + mTitle = title; // Similar to mStateJsonStr, we have to store this. + if (mViewerActivity != null) { + mViewerActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mViewerActivity.setTitle(mTitle); + } + }); + } + } + + public void setState(String stateJsonStr) { + // We have to store this state because ViewerActivity may be destroyed while the native app + // is still running. When a new ViewerActivity is created, we'll pass the state to it. + mStateJsonStr = stateJsonStr; if (mViewerActivity != null) { mViewerActivity.runOnUiThread(new Runnable() { @Override public void run() { - mViewerActivity.setTitle(finalTitle); + mViewerActivity.setState(mStateJsonStr); } }); } diff --git a/platform_tools/android/apps/viewer/src/main/res/layout/activity_main.xml b/platform_tools/android/apps/viewer/src/main/res/layout/activity_main.xml index 6597a48dcc..985b67d085 100644 --- a/platform_tools/android/apps/viewer/src/main/res/layout/activity_main.xml +++ b/platform_tools/android/apps/viewer/src/main/res/layout/activity_main.xml @@ -1,17 +1,36 @@ - - + + + tools:context=".ViewerActivity"> + + + + + + + + - diff --git a/platform_tools/android/apps/viewer/src/main/res/layout/state_item.xml b/platform_tools/android/apps/viewer/src/main/res/layout/state_item.xml new file mode 100644 index 0000000000..7a7d539d43 --- /dev/null +++ b/platform_tools/android/apps/viewer/src/main/res/layout/state_item.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/platform_tools/android/apps/viewer/src/main/res/values/strings.xml b/platform_tools/android/apps/viewer/src/main/res/values/strings.xml new file mode 100644 index 0000000000..582c566679 --- /dev/null +++ b/platform_tools/android/apps/viewer/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Open navigation drawer + Close navigation drawer + \ No newline at end of file -- cgit v1.2.3