8000 GitHub - gzeinnumer/KeepUIState
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

gzeinnumer/KeepUIState

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Keep UI State


Simple Save State Instance.


Content List


Download

Add maven jitpack.io and dependencies in build.gradle (Project) :

// build.gradle project
allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
  }
}

// build.gradle app/module
dependencies {
  ...
  implementation 'com.github.gzeinnumer:KeepStateUI:version'

  //required for example
  implementation 'com.github.gzeinnumer:RecyclerViewAdapterBuilder:2.0.1'
}

Feature List


Tech stack and 3rd library


Usage

Save UI State like SavedInstanceState with Bundle. but with this library, you can keep data/value in View as long as you want, or you can Clear Cache from your app in Application Settings. State will keep save even when you kill your app process.

Activity StateUI

Make instance from StateUI

public class MainActivity extends AppCompatActivity {

    private StateUI stateUI;

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

        stateUI = StateUIBuilder.Build(MainActivity.class, getApplicationContext());
    }
}

Add Value To Keep On StateUI

Use function addView(KEY, VALUE) on onPause() add value that you want to keep and use saveState() to submit your value. When onPause() called StateUI will keep your value.

public class MainActivity extends AppCompatActivity {

    private StateUI stateUI;

    ...

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

        stateUI.addView("binding.edUsername", binding.edUsername.getText().toString());
        stateUI.addView("binding.edPass", binding.edPass.getText().toString());
        stateUI.saveState();
    }
}

Get Value To Display Again

Use function onResume() to get value that you have been save before. Check value in StateUI is exists, if exists than get value with it's own KEY with getValue(KEY) and set value to your view again.

public class MainActivity extends AppCompatActivity {

    private StateUI stateUI;

    ...

    @Override
    protected void onResume() {
        super.onResume();
        if (stateUI.getState()) {
            String userName = stateUI.getValue("binding.edUsername");
            binding.edUsername.setText(userName);
            String pass = stateUI.getValue("binding.edPass");
            binding.edPass.setText(pass);
        }
    }
}

Clear Value From StateUI

Clear your state when you no need it anymore with.

//login and clear last value on form by onClick
binding.btnLogin.setOnClickListener(v -> {
    stateUI.clearState();
    startActivity(new Intent(getApplicationContext(), MenuActivity.class));
});

Here is Full Code MainActivity.java & activity_main.xml

Preview:

(Before) Data lost in onBackPressed() (Before) Data lost in onDestroy() (After) Data keep in onBackPressed() (After) Data keep in onDestroy()

Fragment StateUI

Seems like Activity StateUI. but you need to use onViewCreated and Override public onPauseonResume() and public onResume().

public class HomeFragment extends Fragment {

    private StateUI stateUI;

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        ...

        stateUI = StateUIBuilder.Build(HomeFragment.class, requireContext());
    }

    @Override
    public void onPause() {
        super.onPause();
        stateUI.addView("binding.edUsername", binding.edUsername.getText().toString());
        stateUI.addView("binding.edPass", binding.edPass.getText().toString());
        stateUI.saveState();
    }

    @Override
    public void onResume() {
        super.onResume();
        if (stateUI.getState()) {
            String userName = stateUI.getValue("binding.edUsername");
            binding.edUsername.setText(userName);
            String pass = stateUI.getValue("binding.edPass");
            binding.edPass.setText(pass);
        }
    }
}

Here is Full Code HomeFragment.java & fragment_home.xml

Preview:

(Before) Data lost in onBackPressed() (Before) Data lost in onDestroy() (After) Data keep in onBackPressed() (After) Data keep in onDestroy()

RecyclerView StateUI

You can save List to StateUI. Use function addViewList(KEY, ListStateReceiver<MyModel>) to set value and getValueList(KEY, ListStateCallBack<MyModel>) to get value.

public class RecyclerViewActivity extends AppCompatActivity {
    private List<MyModel> list = new ArrayList<>();
    private StateUI stateUI;

    ...

    @Override
    protected void onPause() {
        super.onPause();
        stateUI.addViewList("binding.rv", new ListStateReceiver<MyModel>() {
            @Override
            public List<MyModel> listReceived() {
                return list;
            }
        });
        stateUI.saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (stateUI.getState()) {
            stateUI.getValueList("binding.rv", new ListStateCallBack<MyModel>() {
                @Override
                public Type setListModel() {
                    // need converter for Gson, put your ModelPojo on TypeToken
                    return new TypeToken<List<MyModel>>(){}.getType();
                }

                @Override
                public void listCallBack(List<MyModel> listFromState) {
                    list = new ArrayList<>(listFromState);
                    initAdapter();
                }
            });
        }
    }
}

Here is Full Code RecyclerViewActivity.java & MyModel.java & activity_recycler_view.xml

Preview:

(Before) Data lost in onBackPressed() (Before) Data lost in onDestroy() (After) Data keep in onBackPressed() (After) Data keep in onDestroy()

Image StateUI

Save As Bitmap

You can save Bitmap from your ImageView. Use function addViewBitmap() to set value and getValueBitmap() to get value.

public class ImageActivity extends AppCompatActivity {

    private StateUI stateUI;

    ...

    private void loadImageGlide() {
        String imgUrl = "https://avatars3.githubusercontent.com/u/45892408?s=460&u=94158c6479290600dcc39bc0a52c74e4971320fc&v=4";

        Glide.with(this).load(imgUrl).error(R.mipmap.ic_launcher).listener(new RequestListener<Drawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                try {
                    stateUI.addViewBitmap("binding.img", (BitmapDrawable) resource);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return false;
            }
        }).into(binding.img);
    }

    private void loadImagePicasso() {
        String imgUrl = "https://avatars3.githubusercontent.com/u/45892408?s=460&u=94158c6479290600dcc39bc0a52c74e4971320fc&v=4";

        Picasso.get().load(imgUrl).into(binding.img, new Callback() {
            @Override
            public void onSuccess() {
                try {
                    stateUI.addViewBitmap("binding.img", (BitmapDrawable) binding.img.getDrawable());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(Exception e) {

            }
        });
    }

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

        stateUI.saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (stateUI.getState()) {
            Bitmap bitmap = stateUI.getValueBitmap("binding.img");
            if (bitmap != null) {
                binding.img.setImageBitmap(bitmap);
            }
        }
    }

    ...
}

Save As Path

You can save Path from your ImageView. Use function addViewPath() to set value and getValuePath() to get value.

Note : This method Required Permission Storage to read file

public class ImageActivity extends AppCompatActivity {

    private StateUI stateUI;

    ...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        ...

        //take image with camera or explisit intent
        String path = "/storage/emulated/0/ExternalFolder/Foto/JPEG_FILE_NAME.jpg";
        stateUI.addViewPath("binding.img", path);

        ...
    }

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

        stateUI.saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (stateUI.getState()) {
            String path = stateUI.getValuePath("binding.img");
            if (path != null){
                Glide.with(this).load(new File(path)).error(R.mipmap.ic_launcher).into(binding.img);
            }
        }
    }

    ...
}

Here is Full Code ImageActivity.java & activity_image.xml

Preview:

(Before) Data lost in onBackPressed() (Before) Data lost in onDestroy() (After) Data keep in onBackPressed() (After) Data keep in onDestroy()

Variable With StateUI

Variable

//onPause()
String data = "sentThisDataToState";
stateUI.addView("data", data);

//onResume()
String data = stateUI.getValue("data");

ViewModel

//onPause()
stateUI.addView("vm.data.getValue()", vm.data.getValue());

//onResume()
String data = stateUI.getValue("vm.data.getValue()");
vm.setData(data);

Clear Value StateUI onStop

READ CAREFULLY!!! IF YOU USE THIS STEP. APP WILL KILL STATE-UI IN YOUR CURRENT ACTIVITY WHEN YOU CLOSE(NOT MINIMIZE) YOUR APP, ONLY ON CURRENT ACTIVITY

You can clear StateUI if you WONT keep it when app killed, put stateUI.clearState() on function onStop().

//ignore this if you want to keep value even when your app Killed
@Override
protected void onStop() {
    super.onStop();
    stateUI.clearState();
}

Clear All StateUI

Call this function every where, this function will Clear All Of Your StateUI that you have been save before, in every Activity/Fragment

stateUI.destroyStateUI();

Example Code/App

Sample Code And App


Version

  • 1.0.0
    • First Release
  • 1.0.1
    • Clear All StateUI
  • 1.0.2
    • Image
  • 2.0.0
    • Support SDK 12

Contribution

You can sent your constibution to branch open-pull.


Copyright 2021 M. Fadli Zein

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

0