diff options
author | liyuqian <liyuqian@google.com> | 2016-05-26 12:43:43 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-05-26 12:43:43 -0700 |
commit | 4e4e30823fba0047b93a56bfcf05c04ca57e82ec (patch) | |
tree | c53c00cf8a97d4ad477b22580ec3ccd5e658559c /platform_tools | |
parent | 497290824f8d2eb6705fd2785e1851cecf9e2b03 (diff) |
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
Diffstat (limited to 'platform_tools')
7 files changed, 270 insertions, 20 deletions
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<String> optionList = new ArrayList<>(); + String[] optionStrings = new String[options.length()]; + for(int i=0; i<options.length(); i++) { + optionList.add(options.getString(i)); + } + optionSpinner.setAdapter(new ArrayAdapter<String>(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 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/mainLayout" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".ViewerActivity"> - <SurfaceView - android:id="@+id/surfaceView" +<android.support.v4.widget.DrawerLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/drawerLayout" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <!-- The main content view --> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/mainLayout" + android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_centerVertical="true" - android:layout_centerHorizontal="true" /> + tools:context=".ViewerActivity"> + + <SurfaceView + android:id="@+id/surfaceView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_centerVertical="true" + android:layout_centerHorizontal="true" /> + + </LinearLayout> + + <!-- The navigation drawer --> + <ListView android:id="@+id/leftDrawer" + android:layout_width="240dp" + android:layout_height="match_parent" + android:layout_gravity="start" + android:choiceMode="singleChoice" + android:divider="@android:color/transparent" + android:dividerHeight="0dp" + android:background="@android:color/background_light"/> +</android.support.v4.widget.DrawerLayout> -</LinearLayout> 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" android:layout_width="match_parent" + android:layout_height="match_parent" + android:weightSum="1"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:layout_marginLeft="10dp" + android:layout_marginBottom="0dp" + android:textAppearance="?android:attr/textAppearanceLarge" + android:text="Name:" + android:id="@+id/nameText" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="10dp" + android:layout_marginLeft="10dp" + android:layout_marginTop="0dp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="Value" + android:id="@+id/valueText" /> + + <Spinner + android:id="@+id/optionSpinner" + android:paddingTop="0dp" + android:paddingBottom="0dp" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + </Spinner> + +</LinearLayout> 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="drawer_open">Open navigation drawer</string> + <string name="drawer_close">Close navigation drawer</string> +</resources>
\ No newline at end of file |