Android Open Source - friendica-for-android Home Activity






From Project

Back to project page friendica-for-android.

License

The source code is released under:

This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

If you think the Android project friendica-for-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package de.wikilab.android.friendica01.activity;
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import java.io.File;
/*  w  w w . ja  va 2 s .  co  m*/
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.google.android.gcm.GCMRegistrar;
import de.wikilab.android.friendica01.FragmentParentListener;
import de.wikilab.android.friendica01.LoginListener;
import de.wikilab.android.friendica01.Max;
import de.wikilab.android.friendica01.R;
import de.wikilab.android.friendica01.TwAjax;
import de.wikilab.android.friendica01.R.anim;
import de.wikilab.android.friendica01.R.id;
import de.wikilab.android.friendica01.R.layout;
import de.wikilab.android.friendica01.fragment.ContentFragment;
import de.wikilab.android.friendica01.fragment.FriendListFragment;
import de.wikilab.android.friendica01.fragment.MessageViewFragment;
import de.wikilab.android.friendica01.fragment.PhotoGalleryFragment;
import de.wikilab.android.friendica01.fragment.PostDetailFragment;
import de.wikilab.android.friendica01.fragment.PostListFragment;
import de.wikilab.android.friendica01.fragment.WritePostFragment;

/**
 * This activity is the application's most important one. It is visible almost
 * all the time (exceptions: Login Screen, Preferences).
 * Everything else is loaded into this activity via Android's fragment mechanism.
 * On small screens, the "menu fragment" (class MainMenuFragment) is slided over
 * the currently visible "view fragment". On large screens (tablets), both Fragments
 * are displayed next to each other.
 *
 * @see res/layout/homeactivity.xml
 * @see res/layout-large/homeactivity.xml
 */
public class HomeActivity extends FragmentActivity implements FragmentParentListener, LoginListener {
  private static final String TAG="Friendica/HomeActivity";

    /**
     * Sender ID for Google's Cloud Messaging service. Maybe this should be configurable,
     * so everybody is able to set up their own account at google.
     * The server administrator has to set this up for their Friendica node.
     */
  public final static String SENDER_ID = "179387721673";

  public static final int RQ_SELECT_PHOTO = 44;
  public static final int RQ_TAKE_PHOTO = 55;

  public File takePhotoTarget;

  boolean isLargeMode = false;
  
  /*
  WelcomeFragment frag_welcome = new WelcomeFragment();
  PostListFragment frag_posts = new PostListFragment();
  WritePostFragment frag_writepost = new WritePostFragment();
  PhotoGalleryFragment frag_photos = new PhotoGalleryFragment();
  FriendListFragment frag_friendlist = new FriendListFragment();
  PostDetailFragment frag_postdetail = new PostDetailFragment();
  MessageViewFragment frag_messages = new MessageViewFragment();
  //PreferenceFragment frag_preferences = new PreferenceFragment();
   */
  
  String currentMMItem = null;


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.homeactivity);

    Max.initDataDirs();

    Log.d(TAG, "screenLayout="+getResources().getConfiguration().screenLayout);
    if (Max.isLarge(getResources().getConfiguration())) {
      // on a large screen device ...
      isLargeMode = true;
    }

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    String userName = prefs.getString("login_user", null);
    if (userName == null || userName.length() < 1) {
      Max.showLoginForm(this, "Please enter account data");
    } else {
      Max.tryLogin(this);
      
      if (savedInstanceState == null) {
        Log.v(TAG, "SaveInstanceState is null");
        navigate(getResources().getString(R.string.mm_timeline));
      } else {
        currentMMItem = savedInstanceState.getString("currentMMItem");
        if (currentMMItem != null) navigate(currentMMItem);
      }

            //--> Google Cloud Messaging
      try {
                GCMRegistrar.checkDevice(this);
                GCMRegistrar.checkManifest(this);
                final String regId = GCMRegistrar.getRegistrationId(this);
                if (regId.equals("")) {
                  Log.v(TAG, "Registering for GCM");
                  GCMRegistrar.register(this, SENDER_ID);
                } else {
                  Log.v(TAG, "Already registered");
                }

            } catch(Exception e) {
                Log.e(TAG, "Google Cloud Messaging not supported - please install Google Apps package!");
                Log.e(TAG, e.toString());
                Log.e(TAG, "Continuing without GCM. Push notifications won't work.");

            }
    }

  
    View toggle = findViewById(R.id.toggle_left_bar);
    if (toggle != null) toggle.setOnClickListener(toggleMenuBarHandler);
    //toggle = findViewById(R.id.toggle_left_bar2);
    //if (toggle != null) toggle.setOnClickListener(toggleMenuBarHandler);
    toggle = findViewById(R.id.left_bar_header);
    if (toggle != null) toggle.setOnClickListener(toggleMenuBarHandler);

    //ViewServer.get(this).addWindow(this);

    Log.i(TAG, "Should check for updates?");

    if (prefs.getBoolean("updateChecker", true)) {
      Log.i(TAG, "Checking for updates...");
      final TwAjax updateChecker = new TwAjax(this, true, false);
      updateChecker.getUrlContent("http://friendica-for-android.wiki-lab.net/docs/update.txt", new Runnable() {
        @Override
        public void run() {
          String res = updateChecker.getResult();
          if (res != null && res.startsWith("UPDATE=")) {
            try {
              int version = Integer.parseInt(res.substring(7));
              int currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0 ).versionCode;
              Log.i(TAG, "UpdateCheck onlineVersion="+version+" currentVersion="+currentVersion);
              if (version > currentVersion) {
                Max.alert(HomeActivity.this, "<a href='http://friendica-for-android.wiki-lab.net/update-landing/'>Click here to load the update!</a><br><br>(Go to Preferences to disable update check)", "Update available!");
              }
            } catch (NameNotFoundException e) {
              e.printStackTrace();
              Log.e(TAG, "UpdateCheck failed! (2)");
            }
          } else {
            Log.e(TAG, "UpdateCheck failed!");
          }
        }
      });
    }

  }

  OnClickListener toggleMenuBarHandler = new OnClickListener() {
    @Override
    public void onClick(View v) {
      toggleMenuBarVisible();
    }
  };
  
  protected void toggleMenuBarVisible() {
    View leftBar = findViewById(R.id.left_bar);
    setMenuBarVisible(leftBar.getVisibility() == View.GONE);
  }
  
  protected void setMenuBarVisible(boolean v) {
    View leftBar = findViewById(R.id.left_bar);
    if (v) {
      Animation anim1 = AnimationUtils.loadAnimation(HomeActivity.this, android.R.anim.slide_in_left);
          anim1.setInterpolator((new AccelerateDecelerateInterpolator()));
          //anim1.setFillAfter(true);
          leftBar.setAnimation(anim1);

      leftBar.setVisibility(View.VISIBLE);
    } else {
      Animation anim1 = AnimationUtils.loadAnimation(HomeActivity.this, R.anim.slide_out_left);
          anim1.setInterpolator((new AccelerateDecelerateInterpolator()));
          anim1.setFillAfter(true);
          leftBar.setAnimation(anim1);

      leftBar.setVisibility(View.GONE);
    }
  }
  
  @Override
  protected void onSaveInstanceState(Bundle outState) {
    outState.putString("currentMMItem", currentMMItem);
    super.onSaveInstanceState(outState);
  }

  @Override
  protected void onStart() {
    super.onStart();

  }

  @Override
  protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

  }


    // This method is used to pass messages from the child fragments to methods in this activity
    //
  @Override
  public void OnFragmentMessage(String message, Object arg1, Object arg2) {
    if (message.equals("Set Header Text")) {
      setHeadertext((String) arg1);
    }
    if (message.equals("Navigate Main Menu")) {
      navigate((String) arg1);
    }
    if (message.equals("Loading Animation")) {
      ((ProgressBar) findViewById(R.id.glob_progressbar)).setVisibility(((Integer)arg1).intValue());
    }
    if (message.equals("Navigate Conversation")) {
      navigateConversation((String) arg1);
    }
  }



    //region Methods called by OnFragmentMessage

    void setHeadertext(String ht) {
        TextView subheading = (TextView) findViewById(R.id.header_text);

        if (subheading != null) subheading.setText(ht);
    }

    /**
     * This is the main entry point for loading new contents into the "view fragment".
     * Called by MainMenuFragment via OnFragmentMessage
     * @param arg1   Display name of the content view fragment to load
     */
  void navigate(String arg1) {
    currentMMItem = arg1;

    if (arg1.equals(getResources().getString(R.string.mm_timeline))) {
      navigatePostList(getResources().getString(R.string.mm_timeline));
    }

    if (arg1.equals(getResources().getString(R.string.mm_notifications))) {
      navigatePostList(getResources().getString(R.string.mm_notifications));
    }

    if (arg1.equals(getResources().getString(R.string.mm_mywall))) {
      navigatePostList(getResources().getString(R.string.mm_mywall));
    }

    if (arg1.equals(getResources().getString(R.string.mm_updatemystatus))) {
      navigateStatusUpdate();
    }

    if (arg1.equals(getResources().getString(R.string.mm_friends))) {
      navigateFriendList();
    }

    if (arg1.equals(getResources().getString(R.string.mm_myphotoalbums))) {
      navigatePhotoGallery(getResources().getString(R.string.mm_myphotoalbums));
    }

    if (arg1.equals(getResources().getString(R.string.mm_takephoto))) {
      Intent in = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      takePhotoTarget = Max.getTempFile();
      in.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(takePhotoTarget));
      startActivityForResult(in, RQ_TAKE_PHOTO);
    }
    if (arg1.equals(getResources().getString(R.string.mm_selectphoto))) {
      Intent in = new Intent(Intent.ACTION_PICK);
      in.setType("image/*");
      startActivityForResult(in, RQ_SELECT_PHOTO);
    }
    if (arg1.equals(getResources().getString(R.string.mm_directmessages))) {
      //Intent in = new Intent(HomeActivity.this, MessagesActivity.class);
      //startActivity(in);
      navigateMessages("msg:all");
    }

    if (arg1.equals(getResources().getString(R.string.mm_preferences))) {
      navigatePreferences();
    }

    if (arg1.equals(getResources().getString(R.string.mm_logout))) {
      SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(HomeActivity.this).edit();
      //prefs.putString("login_server", null); //keep server and user ...
      prefs.putString("login_user", null);
      prefs.putString("login_password", null); //...only remove password
      prefs.commit();

      finish();
    }

  }

    void onNavMainFragment()  {
        if (!isLargeMode) {
            View leftBar = findViewById(R.id.left_bar);
            leftBar.setVisibility(View.GONE);
        }
    }


    // These functions (navigate...) are called by navigate(arg1), which is mostly
    // called by the main menu, or directly by other fragments to load specific content
    // (like direct messages or conversations) by its id

  private void navigateMainFragment(ContentFragment newFragment, String target) {
    onNavMainFragment();
    FragmentTransaction t = getSupportFragmentManager().beginTransaction();
    Bundle b = new Bundle();
    b.putString("target", target);
    newFragment.setArguments(b);
    t.replace(R.id.view_fragment_container, newFragment);
    //t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    t.setCustomAnimations(R.anim.slide_in_right, android.R.anim.slide_out_right);
    t.addToBackStack(null);
    t.commit();
    newFragment.navigate(target);
  }
  
  private void navigateFriendList() {
    navigateMainFragment(new FriendListFragment(), "friendlist");
  }

  private void navigatePostList(String listTarget) {
    navigateMainFragment(new PostListFragment(), listTarget);
  }

  private void navigateConversation(String conversationId) {
    navigateMainFragment(new PostDetailFragment(), "conversation:" + conversationId);
  }

  private void navigatePhotoGallery(String galleryTarget) {
    navigateMainFragment(new PhotoGalleryFragment(), galleryTarget);
  }

  private void navigateMessages(String target) {
    navigateMainFragment(new MessageViewFragment(), target);
  }


  private void navigateStatusUpdate() {
    navigateMainFragment(new WritePostFragment(), "statusupdate");
  }


  private void navigatePreferences() {
        // I wanted to display the preferences inside MainActivity as well, but Android doesn't like this :(

    /*if (! isMultiCol()) {*/
    Intent showContent = new Intent(getApplicationContext(), PreferencesActivity.class);
    //showContent.putExtra("target", listTarget);
    startActivity(showContent);
    /*} else {
        Fragment viewerFragment = (Fragment) getSupportFragmentManager().findFragmentById(R.id.view_fragment_container);
        if (viewerFragment != frag_preferences) {
          FragmentTransaction t = getSupportFragmentManager().beginTransaction();
          t.replace(R.id.view_fragment_container, frag_preferences);
          t.commit();
        }
        frag_preferences.navigate("");
      }*/
  }
  
  
  //never used???
  
/*
  public void navigatePostDetailId(String postId) {
    onNavMainFragment();
    Fragment viewerFragment = (Fragment) getSupportFragmentManager().findFragmentById(R.id.view_fragment_container);
    if (viewerFragment != frag_postdetail) {
      FragmentTransaction t = getSupportFragmentManager().beginTransaction();
      t.replace(R.id.view_fragment_container, frag_postdetail);
      t.commit();
    }
    frag_postdetail.navigate("post:" + postId);
  }
*/
    //endregion


    // This is called by Max.tryLogin after login succeeded and forwards this event to the main
    // menu (refresh numbers of timeline posts, notifications, etc).
  @Override
  public void OnLogin() {
    LoginListener target = (LoginListener) getSupportFragmentManager().findFragmentById(R.id.menu_fragment);
    target.OnLogin();

  }


    // When the "back button" is pressed:
    // - hide the menu if visible
    // - let the content view fragment do something
    // - if none of these were appropriate: pass back button to the system (probably closing the app)
  @Override
  public void onBackPressed() {
    if (!isLargeMode) {
      View leftBar = findViewById(R.id.left_bar);
      if (leftBar.getVisibility() != View.GONE) {
        leftBar.setVisibility(View.GONE);
        return;
      }
    }
    Fragment viewerFragment = (Fragment) getSupportFragmentManager().findFragmentById(R.id.view_fragment_container);
    if (viewerFragment instanceof ContentFragment) {
      if (((ContentFragment)viewerFragment).onBackPressed()) {
        return;
      }
    }
    super.onBackPressed();
  }

  @Override
  public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
      toggleMenuBarVisible();
      return false;
    } else {
      return super.onKeyUp(keyCode, event);
    }
  }
  
}




Java Source Code List

com.handmark.pulltorefresh.library.PullToRefreshAdapterViewBase.java
com.handmark.pulltorefresh.library.PullToRefreshBase.java
com.handmark.pulltorefresh.library.PullToRefreshExpandableListView.java
com.handmark.pulltorefresh.library.PullToRefreshGridView.java
com.handmark.pulltorefresh.library.PullToRefreshListView.java
com.handmark.pulltorefresh.library.PullToRefreshWebView.java
com.handmark.pulltorefresh.library.internal.EmptyViewMethodAccessor.java
com.handmark.pulltorefresh.library.internal.IndicatorLayout.java
com.handmark.pulltorefresh.library.internal.LoadingLayout.java
de.wikilab.android.friendica01.FileUploadService.java
de.wikilab.android.friendica01.FragmentParentListener.java
de.wikilab.android.friendica01.GCMIntentService.java
de.wikilab.android.friendica01.HtmlImageHelper.java
de.wikilab.android.friendica01.LoginListener.java
de.wikilab.android.friendica01.Max.java
de.wikilab.android.friendica01.NotificationCheckerService.java
de.wikilab.android.friendica01.Notification.java
de.wikilab.android.friendica01.TwAjax.java
de.wikilab.android.friendica01.ViewServer.java
de.wikilab.android.friendica01.activity.FriendicaImgUploadActivity.java
de.wikilab.android.friendica01.activity.GenericContentActivity.java
de.wikilab.android.friendica01.activity.HomeActivity.java
de.wikilab.android.friendica01.activity.MainScreenActivity.java
de.wikilab.android.friendica01.activity.MessageDetailActivity.java
de.wikilab.android.friendica01.activity.MessagesActivity.java
de.wikilab.android.friendica01.activity.PreferenceContainerActivity.java
de.wikilab.android.friendica01.activity.PreferencesActivity.java
de.wikilab.android.friendica01.activity.UserProfileActivity.java
de.wikilab.android.friendica01.activity.WritePostActivity.java
de.wikilab.android.friendica01.adapter.HtmlStringArrayAdapter.java
de.wikilab.android.friendica01.adapter.MessageContentAdapter.java
de.wikilab.android.friendica01.adapter.MessageListAdapter.java
de.wikilab.android.friendica01.adapter.PhotoGalleryAdapter.java
de.wikilab.android.friendica01.adapter.PostListAdapter.java
de.wikilab.android.friendica01.fragment.ContentFragment.java
de.wikilab.android.friendica01.fragment.FriendListFragment.java
de.wikilab.android.friendica01.fragment.MainMenuFragment.java
de.wikilab.android.friendica01.fragment.MessageViewFragment.java
de.wikilab.android.friendica01.fragment.MessageWriteFragment.java
de.wikilab.android.friendica01.fragment.PhotoGalleryFragment.java
de.wikilab.android.friendica01.fragment.PostDetailFragment.java
de.wikilab.android.friendica01.fragment.PostListFragment.java
de.wikilab.android.friendica01.fragment.WelcomeFragment.java
de.wikilab.android.friendica01.fragment.WritePostFragment.java