package com.truckmuncher.app.customer; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.NavUtils; import android.support.v4.app.TaskStackBuilder; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.widget.Toast; import com.truckmuncher.app.R; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; import static com.guava.common.base.Preconditions.checkNotNull; public class TruckDetailsActivity extends AppCompatActivity implements TruckDataLoaderHandler.OnTriedToLoadInvalidTruckListener { public static final String ARG_ENDING_TRUCK = "ending_truck"; private static final String ARG_TRUCK_IDS = "truck_ids"; private static final String ARG_STARTING_TRUCK = "starting_truck"; @InjectView(R.id.view_pager) ViewPager viewPager; TruckDetailsPagerAdapter adapter; /** * @param startingTruck the first truck to display */ public static Intent newIntent(Context context, @NonNull ArrayList<String> truckIds, @NonNull String startingTruck) { Intent intent = new Intent(context, TruckDetailsActivity.class); intent.putStringArrayListExtra(ARG_TRUCK_IDS, checkNotNull(truckIds)); intent.putExtra(ARG_STARTING_TRUCK, checkNotNull(startingTruck)); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_truck_details); getSupportActionBar().setDisplayHomeAsUpEnabled(true); ButterKnife.inject(this); Intent intent = getIntent(); String startingTruck; List<String> truckIds; if (intent.getData() == null) { // We were launched directly truckIds = intent.getStringArrayListExtra(ARG_TRUCK_IDS); startingTruck = intent.getStringExtra(ARG_STARTING_TRUCK); } else { // Launched through deep link try { // We expect: truckmuncher.com/#/trucks/truck-id URI javaUri = new URI(intent.getData().toString()); // if the uri contains a # symbol, the data will be in the fragment; otherwise in the path String key = javaUri.getFragment() != null ? javaUri.getFragment() : javaUri.getPath(); String[] segments = key.substring(1).split("/"); int size = segments.length; if (size < 2 || !segments[size - 2].equalsIgnoreCase("trucks")) { throw new URISyntaxException(javaUri.toString(), "Segment structure not what we expected"); } startingTruck = segments[size - 1]; truckIds = Collections.singletonList(startingTruck); } catch (URISyntaxException e) { Intent forwardingIntent = new Intent(Intent.ACTION_VIEW); forwardingIntent.setData(intent.getData()); startActivity(forwardingIntent); finish(); return; } } adapter = new TruckDetailsPagerAdapter(getSupportFragmentManager(), truckIds); viewPager.setAdapter(adapter); viewPager.setCurrentItem(adapter.getTruckPosition(startingTruck)); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent parent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, parent)) { NavUtils.navigateUpTo(this, parent); } else { TaskStackBuilder.create(this) .addParentStack(this) .startActivities(); } return true; default: return super.onOptionsItemSelected(item); } } @Override public void finish() { Intent intent = new Intent(); intent.putExtra(ARG_ENDING_TRUCK, adapter.getTruckId(viewPager.getCurrentItem())); setResult(RESULT_OK, intent); super.finish(); } @Override public void onTriedToLoadInvalidTruck() { Toast.makeText(this, R.string.error_invalid_truck, Toast.LENGTH_LONG).show(); finish(); } }