org.retrostore.android.RetrostoreActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.retrostore.android.RetrostoreActivity.java

Source

/*
 * Copyright 2017, Sascha Haeberling
 *
 * 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 org.retrostore.android;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;

import org.retrostore.RetrostoreClientImpl;
import org.retrostore.android.net.DataFetcher;
import org.retrostore.android.view.ImageLoader;
import org.retrostore.android.view.ViewAdapter;
import org.retrostore.client.common.proto.App;

import java.util.List;
import java.util.concurrent.Executors;

import static java.util.Locale.US;

public class RetrostoreActivity extends AppCompatActivity {
    private DataFetcher mFetcher;
    private ImageLoader mImageLoader;

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private SwipeRefreshLayout mRefreshLayout;
    private InternalAppInstallListener mAppInstallListener;

    private static AppInstallListener mExternalListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrostore);
        mAppInstallListener = new InternalAppInstallListener() {
            @Override
            public void onInstallApp(App app) {
                showDetailsPage(app.getId());
            }
        };
        mFetcher = DataFetcher.initialize(RetrostoreClientImpl.getDefault("n/a"),
                Executors.newSingleThreadExecutor());
        mImageLoader = ImageLoader.get(this.getApplicationContext());
        mRecyclerView = (RecyclerView) findViewById(R.id.appList);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_layout);
        mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshApps();
            }
        });
        refreshApps();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_app_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.menu_refresh) {
            refreshApps();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * Protected so only the RetroStore API can access this. Not to be used directly by clients.
     */
    static void setAppInstallListener(AppInstallListener listener) {
        mExternalListener = listener;
    }

    private void showDetailsPage(String appId) {
        AppDetailsPageActivity.setAppInstallListener(mExternalListener);
        Intent intent = new Intent(this, AppDetailsPageActivity.class);
        intent.putExtra(AppDetailsPageActivity.EXTRA_APP_ID, appId);
        startActivity(intent);
    }

    private void refreshApps() {
        setRefreshingStatus(true);
        // FIXME: I don't see variable names for the API.
        Futures.addCallback(mFetcher.getAppsAsync(), new FutureCallback<List<App>>() {
            @Override
            public void onSuccess(List<App> result) {
                onAppsReceived(result);
                setRefreshingStatus(false);
            }

            @Override
            public void onFailure(Throwable t) {
                showToast("Something went wrong during the request: " + t.getMessage());
                setRefreshingStatus(false);
            }
        });
    }

    /**
     * Apps list received. Display in list.
     */
    private void onAppsReceived(final List<App> apps) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mAdapter = new ViewAdapter(mImageLoader, apps, mAppInstallListener);
                mRecyclerView.setAdapter(mAdapter);
            }
        });
    }

    private void setRefreshingStatus(final boolean refreshing) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mRefreshLayout.setRefreshing(refreshing);
            }
        });
    }

    /**
     * Show a toast with the given message on the main thread.
     */
    private void showToast(final String message) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(RetrostoreActivity.this, message, Toast.LENGTH_SHORT).show();
            }
        });
    }

    public interface InternalAppInstallListener {
        void onInstallApp(App app);
    }
}