content: /*
   * Copyright (C) 2017 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may not
   * use this file except in compliance with the License. You may obtain a copy of
   * the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
   * License for the specific language governing permissions and limitations under
   * the License.
   */
  package com.android.launcher3.testcomponent;
  
  import android.app.Activity;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.os.Bundle;
  import android.util.TypedValue;
  import android.view.View;
  import android.widget.Button;
  import android.widget.LinearLayout;
  import android.widget.LinearLayout.LayoutParams;
  
  import java.lang.reflect.Method;
  import java.lang.reflect.Modifier;
  
  /**
   * Base activity with utility methods to help automate testing.
   */
  public class BaseTestingActivity extends Activity implements View.OnClickListener {
  
      public static final String SUFFIX_COMMAND = "-command";
      public static final String EXTRA_METHOD = "method";
      public static final String EXTRA_PARAM = "param_";
  
      private static final int MARGIN_DP = 20;
  
      private final String mAction = this.getClass().getName();
  
      private LinearLayout mView;
      private int mMargin;
  
      private final BroadcastReceiver mCommandReceiver = new BroadcastReceiver() {
  
          @Override
          public void onReceive(Context context, Intent intent) {
              handleCommand(intent);
          }
      };
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          mMargin = Math.round(TypedValue.applyDimension(
                  TypedValue.COMPLEX_UNIT_DIP, MARGIN_DP, getResources().getDisplayMetrics()));
          mView = new LinearLayout(this);
          mView.setPadding(mMargin, mMargin, mMargin, mMargin);
          mView.setOrientation(LinearLayout.VERTICAL);
          setContentView(mView);
  
          registerReceiver(mCommandReceiver, new IntentFilter(mAction + SUFFIX_COMMAND));
      }
  
      protected void addButton(String title, String method) {
          Button button = new Button(this);
          button.setText(title);
          button.setTag(method);
          button.setOnClickListener(this);
  
          LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
          lp.bottomMargin = mMargin;
          mView.addView(button, lp);
      }
  
      @Override
      protected void onResume() {
          super.onResume();
          sendBroadcast(new Intent(mAction).putExtra(Intent.EXTRA_INTENT, getIntent()));
      }
  
      @Override
      protected void onDestroy() {
          unregisterReceiver(mCommandReceiver);
          super.onDestroy();
      }
  
      @Override
      public void onClick(View view) {
          handleCommand(new Intent().putExtra(EXTRA_METHOD, (String) view.getTag()));
      }
  
      private void handleCommand(Intent cmd) {
          String methodName = cmd.getStringExtra(EXTRA_METHOD);
          try {
              Method method = null;
              for (Method m : this.getClass().getDeclaredMethods()) {
                  if (methodName.equals(m.getName()) &&
                          !Modifier.isStatic(m.getModifiers()) &&
                          Modifier.isPublic(m.getModifiers())) {
                      method = m;
                      break;
                  }
              }
              Object[] args = new Object[method.getParameterTypes().length];
              Bundle extras = cmd.getExtras();
              for (int i = 0; i < args.length; i++) {
                  args[i] = extras.get(EXTRA_PARAM + i);
              }
              method.invoke(this, args);
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
      }
  
      public static Intent getCommandIntent(Class<?> clazz, String method) {
          return new Intent(clazz.getName() + SUFFIX_COMMAND)
                  .putExtra(EXTRA_METHOD, method);
      }
  }
  