How to create WALLPAPER APP in Android Studio: Complete Source Code...
Download the Source Code of the Wallpaper App (Github) - CLICK HERE
FullScreenActivity.java
package android.tutorials.wallpaperapp;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.app.DownloadManager;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.view.View;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.github.chrisbanes.photoview.PhotoView;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.io.File;
import java.io.IOException;
public class FullScreenActivity extends AppCompatActivity {
String originalUrl;
PhotoView photoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_full_screen);
getSupportActionBar().hide();
Intent intent = getIntent();
originalUrl = intent.getStringExtra("originalUrl");
photoView =findViewById(R.id.photoView);
Glide.with(this).load(originalUrl).into(photoView);
}
public void SetWallpaper(View view) {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
Bitmap bitmap = ((BitmapDrawable) photoView.getDrawable()).getBitmap();
try {
wallpaperManager.setBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(this, "Wallpaper Set Successfully!!!", Toast.LENGTH_SHORT).show();
}
public void DownloadWallpaper(View view) {
Dexter.withActivity(this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
DownloadManager downloadManager =(DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(originalUrl);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
String subPath = "Wallpaper App" + "/" +System.currentTimeMillis() + ".png";
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, subPath);
downloadManager.enqueue(request);
Uri uri1 = Uri.parse(subPath);
Intent intent =new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(uri1);
startActivity(intent);
Toast.makeText(FullScreenActivity.this, "Downloading Wallpaper Started...", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package",getPackageName(),null);
intent.setData(uri);
startActivity(intent);
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
permissionToken.continuePermissionRequest();
}
}).check();
}
}
MainActivity.java
package android.tutorials.wallpaperapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.EditText;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
WallpaperAdapter wallpaperAdapter;
List<WallpaperModel> wallpaperModelList;
int pageNumber = 1;
Boolean isScrolling = false;
int currentItems, totalItems, scrollOutItems;
String url = "https://api.pexels.com/v1/curated/?page="+pageNumber+"&per_page=80";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Casting all things
recyclerView = findViewById(R.id.recyclerView);
wallpaperModelList = new ArrayList<>();
wallpaperAdapter = new WallpaperAdapter(this, wallpaperModelList);
recyclerView.setAdapter(wallpaperAdapter);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
isScrolling = true;
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = gridLayoutManager.getChildCount();
totalItems = gridLayoutManager.getItemCount();
scrollOutItems = gridLayoutManager.findFirstVisibleItemPosition();
if (isScrolling && (currentItems + scrollOutItems == totalItems)){
isScrolling = false;
fetchWallpaper();
}
}
});
fetchWallpaper();
}
public void fetchWallpaper() {
StringRequest request = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("photos");
int length = jsonArray.length();
for (int i = 0; i < length; i++) {
JSONObject object = jsonArray.getJSONObject(i);
int id = object.getInt("id");
JSONObject objectImages = object.getJSONObject("src");
String originalUrl = objectImages.getString("original");
String mediumUrl = objectImages.getString("medium");
WallpaperModel wallpaperModel = new WallpaperModel(id, originalUrl, mediumUrl);
wallpaperModelList.add(wallpaperModel);
}
wallpaperAdapter.notifyDataSetChanged();
pageNumber++;
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("Authorization","563492ad6f917000010000018c8c95b063244287b5054c46da8687d7");
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
queue.add(request);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.nav_search){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final EditText editText = new EditText(this);
editText.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
builder.setView(editText);
builder.setMessage("Enter the Category e.g. Car");
builder.setTitle("Search Wallpaper");
builder.setPositiveButton("Search", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String query = editText.getText().toString().toLowerCase();
url = "https://api.pexels.com/v1/curated/?page="+pageNumber+"&per_page=80&query="+query;
wallpaperModelList.clear();
fetchWallpaper();
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).show();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Android Tutorials");//Are you sure you want to Exit ?
builder.setMessage("Subscribe this Channel for more Android Tutorials"); //Thanks for using our Wallpaper App. Give your vauable feedback
builder.setCancelable(false);
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishAffinity();
}
});
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNeutralButton("RATE US !", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String url = "https://play.google.com/store/apps/details?id="+ getApplicationContext().getPackageName();
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}
WallpaperAdapter.java
package android.tutorials.wallpaperapp;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.util.List;
public class WallpaperAdapter extends RecyclerView.Adapter<WallpaperViewHolder> {
private Context context;
List<WallpaperModel> wallpaperModels;
public WallpaperAdapter(Context context, List<WallpaperModel> wallpaperModels) {
this.context = context;
this.wallpaperModels = wallpaperModels;
}
@NonNull
@Override
public WallpaperViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.wallpaper_item,parent,false);
return new WallpaperViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull WallpaperViewHolder holder, int position) {
Glide.with(context).load(wallpaperModels.get(position).getMediumUrl()).into(holder.imageView);
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context.startActivity(new Intent(context, FullScreenActivity.class)
.putExtra("originalUrl", wallpaperModels.get(position).getOriginalUrl()));
}
});
}
@Override
public int getItemCount() {
return wallpaperModels.size();
}
}
class WallpaperViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
public WallpaperViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageViewItem);
}
}
WallpaperModel.java
package android.tutorials.wallpaperapp;
public class WallpaperModel {
private int id; private String originalUrl, mediumUrl;
public WallpaperModel() { }
public WallpaperModel(int id, String originalUrl, String mediumUrl) { this.id = id; this.originalUrl = originalUrl; this.mediumUrl = mediumUrl; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getOriginalUrl() { return originalUrl; }
public void setOriginalUrl(String originalUrl) { this.originalUrl = originalUrl; }
public String getMediumUrl() { return mediumUrl; }
public void setMediumUrl(String mediumUrl) { this.mediumUrl = mediumUrl; }}
AndroidManifest.xml
package android.tutorials.wallpaperapp;
public class WallpaperModel {
private int id;
private String originalUrl, mediumUrl;
public WallpaperModel() {
}
public WallpaperModel(int id, String originalUrl, String mediumUrl) {
this.id = id;
this.originalUrl = originalUrl;
this.mediumUrl = mediumUrl;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOriginalUrl() {
return originalUrl;
}
public void setOriginalUrl(String originalUrl) {
this.originalUrl = originalUrl;
}
public String getMediumUrl() {
return mediumUrl;
}
public void setMediumUrl(String mediumUrl) {
this.mediumUrl = mediumUrl;
}
}
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.tutorials.wallpaperapp">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.SET_WALLPAPER"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.WallpaperApp"> <activity android:name=".FullScreenActivity"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
</manifest>
build.gradle
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.tutorials.wallpaperapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.WallpaperApp">
<activity android:name=".FullScreenActivity"/>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
plugins { id 'com.android.application' id 'com.google.gms.google-services' id 'com.google.firebase.firebase-perf'}
android { compileSdkVersion 29
defaultConfig { applicationId "android.tutorials.wallpaperapp" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'com.google.firebase:firebase-analytics:18.0.0' implementation 'com.google.firebase:firebase-perf:19.0.9' implementation 'com.google.firebase:firebase-messaging:21.0.0' implementation 'com.google.firebase:firebase-inappmessaging-display:19.1.2' testImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//Volley Library implementation 'com.android.volley:volley:1.1.1'
//Dexter Library implementation 'com.karumi:dexter:6.2.1'
//Glide Library implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
//photoview Library implementation 'com.github.chrisbanes:PhotoView:2.3.0'}
activity_full_screen.xml
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
id 'com.google.firebase.firebase-perf'
}
android {
compileSdkVersion 29
defaultConfig {
applicationId "android.tutorials.wallpaperapp"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.firebase:firebase-analytics:18.0.0'
implementation 'com.google.firebase:firebase-perf:19.0.9'
implementation 'com.google.firebase:firebase-messaging:21.0.0'
implementation 'com.google.firebase:firebase-inappmessaging-display:19.1.2'
testImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//Volley Library
implementation 'com.android.volley:volley:1.1.1'
//Dexter Library
implementation 'com.karumi:dexter:6.2.1'
//Glide Library
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
//photoview Library
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" tools:context=".FullScreenActivity">
<com.github.chrisbanes.photoview.PhotoView android:id="@+id/photoView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/downloadWallpaper" />
<Button android:id="@+id/downloadWallpaper" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/setWallpaper" android:layout_margin="5dp" android:onClick="DownloadWallpaper" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="DOWNLOAD WALLPAPER" />
<Button android:id="@+id/setWallpaper" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_margin="5dp" android:onClick="SetWallpaper" android:padding="10dp" android:text="Set Wallpaper" />
</RelativeLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".FullScreenActivity">
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/photoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/downloadWallpaper" />
<Button
android:id="@+id/downloadWallpaper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/setWallpaper"
android:layout_margin="5dp"
android:onClick="DownloadWallpaper"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="DOWNLOAD WALLPAPER" />
<Button
android:id="@+id/setWallpaper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="5dp"
android:onClick="SetWallpaper"
android:padding="10dp"
android:text="Set Wallpaper" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /></androidx.constraintlayout.widget.ConstraintLayout>
wallpaper_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="275dp">
<ImageView android:id="@+id/imageViewItem" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="2.5dp" android:scaleType="centerCrop" />
</androidx.constraintlayout.widget.ConstraintLayout>
mail.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="275dp">
<ImageView
android:id="@+id/imageViewItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="2.5dp"
android:scaleType="centerCrop" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="SEARCH"
app:showAsAction="always"
android:id="@+id/nav_search"/>
</menu>
إرسال تعليق