/*
 * 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.example.creation;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;

import com.google.firebase.appindexing.Action;
import com.google.firebase.appindexing.builders.Actions
import com.google.firebase.appindexing.FirebaseAppIndex;
import com.google.firebase.appindexing.FirebaseUserActions;
import com.google.firebase.appindexing.Indexable;

public class MainActivity extends Activity {
  <caret>

  @Override
  public void onStart() {
    super.onStart();
    FirebaseAppIndex.getInstance().update(new Indexable.Builder().setName("Main").setUrl("http://www.hello.com/main").build());
    FirebaseUserActions.getInstance().start(getIndexApiAction());
  }

  @Override
  public void onStop() {
    super.onStop();
  }

  public Action getIndexApiAction() {
    return Actions.newView("Main", "http://www.hello.com/main");
  }
}
